Come creare l'URL dell'API Web ASP.NET?


Risposte:


139

L' ApiController ha una proprietà chiamata Url che è di tipo System.Web.Http.Routing.UrlHelper che consente di costruire URL per i controller API.

Esempio:

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";
    }

    ...
}

Questo UrlHelper non esiste né nelle tue visualizzazioni né nei controller standard.


AGGIORNARE:

E per eseguire il routing al di fuori di un ApiController puoi fare quanto segue:

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

o all'interno di una vista:

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

Notare il httproute = ""token di rotta che è importante.

Ovviamente questo presuppone che la tua rotta Api sia chiamata DefaultApinel tuo metodo RegisterRoutes in Global.asax:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

Questo .. davvero non mi aiuta molto poiché ho bisogno che la mia vista sia in grado di generare URL in modo sicuro. Se esiste una licenza Go Live, qual è il modo "Go Live" per creare URL nella vista?
Shane Courtrille,

Ancora più importante, questo non funzionerà se stai usando ASP.Net Development Server poiché cambia le porte tutto il tempo, quindi non puoi nemmeno hardcore l'URL nella vista.
Shane Courtrille,

@ShaneCourtrille, ho aggiornato la mia risposta per illustrare come potresti usare il normale System.Web.Mvc.UrlHelperper generare rotte API al di fuori di un HttpControllerContext.
Darin Dimitrov,

Grazie mille! Stavo cercando di utilizzare RouteUrl ma non sapevo del requisito del parametro httproute.
Shane Courtrille,

2
Capisco lo scopo del campione; Sto dicendo che sarebbe un esempio più utile se inserissi una riga di codice ViewBag perché dimostreresti che questo valore è ciò che stavamo cercando di ottenere in uno scenario probabile e non solo eseguendo un codice arbitrario. Ancora una volta, non avrei commentato se non avessi sprecato un paio di minuti non riuscendo a rendermi conto di ciò che mi ero perso prima di riconoscere finalmente che la particolare riga di codice era quella pertinente.
Jon Davis

43

Funziona con la forma più semplice, Url.Actionquindi non è necessario fare riferimento a nomi di routing:

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

Potresti voler aggiungere un area = ""se l'URL è necessario all'interno di un'area. (I controller API sono al di fuori delle aree per impostazione predefinita.) Sto usando MVC 4.


7
UrlHelper in Web Api è msdn.microsoft.com/en-us/library/… , non ha un metodo di azione.
Yuriy Faktorovich

8
@YuriyFaktorovich Questo post implica che Url.Actionviene utilizzato da una vista. Urlè di tipo System.Web.Mvc.UrlHelpere non è associato a WebApipercorsi. Questo è il motivo per cui è necessario il parametro in più: new { httproute = "" }.
Jesse

3
Ho aggiunto httproute""ma non è mappatura = /
Maslow

Ho dovuto aggiungere il collegamento con un'area vuota e attributi html nulli @Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null) ma ha funzionato perfettamente
Christopher G. Lewis

2
Funziona perfettamente da una vista, tuttavia, non sono sicuro del motivo per cui genera il nome dell'azione come una stringa di query come: / api / dashboard? Action = getdata. Mi aspettavo questo: / api / dashboard / getdata
umutesen

7

Vuoi essere in grado di generare collegamenti in modo sicuro, senza stringhe hardcoded (nomi di controller)?

C'è una pepita per questo! (ed è scritto da Mark Seeman)

https://github.com/ploeh/Hyprlinkr

Funziona così:

Itinerari, come al solito:

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

Ottieni un URL:

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

Risultato:

http://localhost/api/foo/1337

3

Ecco il metodo KISS per rispondere alla domanda:

Se questo è il codice che useresti per creare un URL del controller MVC

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

Per ottenere un URL per la versione API del controller (supponendo che tu usi lo stesso nome del controller) puoi usare

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

Tutto ciò che il metodo Url.Action sta facendo è aggiungere il percorso root dell'applicazione, con il nome del controller, seguito dal nome dell'azione (a meno che non sia "Index", nel qual caso non viene aggiunto. Se l'oggetto dei valori di route ha un id proprietà il valore viene aggiunto anche all'URL.


Grazie! Mi mancava api/prima il nome del mio controller.
Daniel Congrove,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.