Comment créer l'URL de l'API Web ASP.NET?

120

Dans ASP.NET MVC, nous avons @Url.Actiondes actions. Y a-t-il quelque chose de similaire comme @Url.Apiqui serait acheminé vers / api / controller?

Shane Courtrille
la source

Réponses:

139

L' ApiController a une propriété appelée Url qui est de type System.Web.Http.Routing.UrlHelper qui vous permet de créer des URL pour les contrôleurs d'API.

Exemple:

public class ValuesController : ApiController
{
    // GET /api/values
    public IEnumerable<string> Get()
    {
        // returns /api/values/123
        string url = Url.Route("DefaultApi", new { controller = "values", id = "123" });
        return new string[] { "value1", "value2" };
    }

    // GET /api/values/5
    public string Get(int id)
    {
        return "value";
    }

    ...
}

Cet UrlHelper n'existe ni dans vos vues ni dans les contrôleurs standard.


METTRE À JOUR:

Et pour effectuer le routage en dehors d'un ApiController, vous pouvez effectuer les opérations suivantes:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        string url = Url.RouteUrl(
            "DefaultApi", 
            new { httproute = "", controller = "values", id = "123" }
        );
        return View();
    }
}

ou à l'intérieur d'une vue:

<script type="text/javascript">
    var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
    $.ajax({
       url: url,
       type: 'GET',
       success: function(result) {
           // ...
       }
    });
</script>

Notez le httproute = ""jeton d'itinéraire qui est important.

Évidemment, cela suppose que votre route Api est appelée DefaultApidans votre méthode RegisterRoutes dans Global.asax:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
Darin Dimitrov
la source
Cela ... ne m'aide vraiment pas beaucoup car j'ai besoin de ma vue pour pouvoir générer des URL en toute sécurité. S'il existe une licence Go Live, quelle est la méthode «Go Live» pour créer des URL sur la vue?
Shane Courtrille
Plus important encore, cela ne fonctionnera pas si vous utilisez ASP.Net Development Server car il change de port tout le temps, vous ne pouvez donc même pas intégrer l'URL dans la vue.
Shane Courtrille
@ShaneCourtrille, j'ai mis à jour ma réponse pour illustrer comment vous pouvez utiliser la normale System.Web.Mvc.UrlHelperpour générer des routes Api en dehors d'un HttpControllerContext.
Darin Dimitrov le
Merci beaucoup! J'essayais d'utiliser RouteUrl mais je ne connaissais pas l'exigence de paramètre httproute.
Shane Courtrille
2
Je comprends le but de l'échantillon; Je dis que ce serait un exemple plus utile si vous ajoutiez une ligne de code ViewBag parce que vous démontreriez que cette valeur est ce à quoi nous essayons d'obtenir dans un scénario probable et pas seulement en exécutant du code arbitraire. Encore une fois, je n'aurais pas fait de commentaire si je n'avais pas perdu quelques minutes à ne pas réaliser ce que j'avais manqué avant de finalement reconnaître que la ligne de code particulière était la plus pertinente.
Jon Davis
43

Cela fonctionne avec la forme la plus simple de Url.Actionsorte que vous ne devez référencer aucun nom de routage:

Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })

Vous pouvez ajouter un area = ""si l'URL est nécessaire dans une zone. (Les contrôleurs Api sont en dehors des zones par défaut.) J'utilise MVC 4.

Gábor Imre
la source
7
Le UrlHelper dans Web Api est msdn.microsoft.com/en-us/library/ ... , il n'a pas de méthode d'action.
Yuriy Faktorovich
8
@YuriyFaktorovich Ce message implique qu'il Url.Actionest utilisé à partir d'une vue. Urlest de type System.Web.Mvc.UrlHelperet ne correspond pas aux WebApiitinéraires. Ceci est la raison pour laquelle vous avez besoin du paramètre supplémentaire: new { httproute = "" }.
Jesse
3
J'ai ajouté httproute""mais ce n'est pas du mappage = /
Maslow
J'ai dû ajouter le lien avec une zone vide et null htmlAttributes @Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null) mais cela a parfaitement fonctionné
Christopher G. Lewis
2
Cela fonctionne parfaitement d'un point de vue, cependant, je ne sais pas pourquoi il génère le nom de l'action sous forme de chaîne de requête comme: / api / dashboard? Action = getdata. Je m'attendais à ceci: / api / dashboard / getdata
umutesen
7

Vous voulez être en mesure de générer des liens de manière sécurisée, sans chaînes codées en dur (noms de contrôleur)?

Il y a une pépite pour ça! (et c'est écrit par Mark Seeman)

https://github.com/ploeh/Hyprlinkr

Fonctionne comme ceci:

Itinéraires, comme d'habitude:

name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }

Obtenez une URL:

var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));

Résultat:

http://localhost/api/foo/1337
Cristian Diaconescu
la source
3

Voici la méthode KISS pour répondre à la question:

S'il s'agit du code que vous utiliseriez pour créer une URL de contrôleur MVC

@Url.Action("Edit", "MyController")

Afin d'obtenir une URL pour la version API du contrôleur (en supposant que vous utilisez le même nom de contrôleur), vous pouvez utiliser

@Url.Action("Edit", "api/MyController")

Tout ce que fait la méthode Url.Action est d'ajouter le chemin racine de l'application, avec le nom du contrôleur, suivi du nom de l'action (sauf s'il s'agit de "Index", auquel cas il n'est pas ajouté. Si l'objet de valeurs d'itinéraire a un identifiant property la valeur est également ajoutée à l'URL.

James Bunch
la source
Je vous remercie! Il me manquait le nom api/avant mon contrôleur.
Daniel Congrove