Jak utworzyć adres URL interfejsu API sieci Web ASP.NET?

120

W ASP.NET MVC mamy @Url.Actiondla akcji. Czy jest coś podobnego @Url.Apido / api / kontrolera?

Shane Courtrille
źródło

Odpowiedzi:

139

ApiController ma właściwość o nazwie URL , który jest typu System.Web.Http.Routing.UrlHelper który pozwala skonstruować adresy URL dla kontrolerów API.

Przykład:

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

    ...
}

Ten UrlHelper nie istnieje ani w widokach, ani w standardowych kontrolerach.


AKTUALIZACJA:

Aby wykonać routing poza ApiController, możesz wykonać następujące czynności:

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

lub wewnątrz widoku:

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

Zwróć uwagę na httproute = ""znacznik trasy, który jest ważny.

Oczywiście zakłada się, że Twoja trasa API jest wywoływana DefaultApiw metodzie RegisterRoutes w Global.asax:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
Darin Dimitrov
źródło
To… naprawdę niewiele mi pomaga, ponieważ potrzebuję widoku, aby móc generować adresy URL w bezpieczny sposób. Jeśli istnieje licencja Go Live, jaki jest sposób tworzenia adresów URL w widoku „Go Live”?
Shane Courtrille
Co ważniejsze, to nie zadziała, jeśli używasz ASP.Net Development Server, ponieważ cały czas zmienia porty, więc nie możesz nawet hardcore'ować adresu URL w widoku.
Shane Courtrille
@ShaneCourtrille, zaktualizowałem moją odpowiedź, aby zilustrować, jak można użyć normalnej System.Web.Mvc.UrlHelperdo generowania tras interfejsu API poza HttpControllerContext.
Darin Dimitrov
Dziękuję bardzo! Próbowałem użyć RouteUrl, ale nie wiedziałem o wymaganiu parametru httproute.
Shane Courtrille
2
Rozumiem cel próbki; Twierdzę, że bardziej przydatna byłaby próbka, gdybyś wrzucił jeden wiersz kodu ViewBag, ponieważ wykazałbyś, że ta wartość jest tym, do czego próbowaliśmy uzyskać w prawdopodobnym scenariuszu, a nie tylko wykonując dowolny kod. Ponownie nie skomentowałbym, gdybym nie zmarnował kilku minut, nie zdając sobie sprawy z tego, co przegapiłem, zanim w końcu zorientowałem się, że konkretna linia kodu jest odpowiednia.
Jon Davis
43

Działa z prostszą formą, Url.Actiondzięki czemu nie musisz odwoływać się do żadnych nazw routingu:

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

Możesz dodać, area = ""jeśli adres URL jest potrzebny w obszarze. (Kontrolery API są domyślnie poza obszarami). Używam MVC 4.

Gábor Imre
źródło
7
UrlHelper w interfejsie Web Api to msdn.microsoft.com/en-us/library/… , nie ma metody akcji.
Yuriy Faktorovich
8
@YuriyFaktorovich Ten post sugeruje, że Url.Actionjest używany z widoku. Urljest typu System.Web.Mvc.UrlHelperi nie jest mapowany na WebApitrasy. Dlatego potrzebny jest dodatkowy parametr: new { httproute = "" }.
Jesse
3
Dodałem, httproute""ale to nie jest mapowanie = /
Maslow
Musiałem dodać link z pustym obszarem i null htmlAttributes, @Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null) ale zadziałało idealnie
Christopher G. Lewis
2
Z punktu widzenia działa to doskonale, jednak nie jestem pewien, dlaczego generuje nazwę akcji jako ciąg zapytania, taki jak: / api / dashboard? Action = getdata. Spodziewałem się tego: / api / dashboard / getdata
umutesen
7

Chcesz mieć możliwość generowania łączy w sposób bezpieczny dla typów, bez zakodowanych na stałe ciągów znaków (nazw kontrolerów)?

Jest na to bryłka! (napisane przez Marka Seemana)

https://github.com/ploeh/Hyprlinkr

Działa tak:

Trasy jak zwykle:

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

Uzyskaj adres URL:

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

Wynik:

http://localhost/api/foo/1337
Cristian Diaconescu
źródło
3

Oto metoda KISS, aby odpowiedzieć na pytanie:

Jeśli jest to kod, którego można użyć do utworzenia adresu URL kontrolera MVC

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

Aby uzyskać adres URL dla wersji API kontrolera (zakładając, że używasz tej samej nazwy kontrolera), możesz użyć

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

Wszystko, co robi metoda Url.Action, to dołączanie ścieżki głównej aplikacji z nazwą kontrolera, po której następuje nazwa akcji (chyba że jest to „Indeks”, w którym to przypadku nie jest dodawany. Jeśli obiekt wartości trasy ma identyfikator właściwość wartość jest również dołączana do adresu URL.

James Bunch
źródło
Dziękuję Ci! Brakowało api/mi nazwy kontrolera przed.
Daniel Congrove