Як створити URL-адресу веб-API ASP.NET?


Відповіді:


139

ApiController має властивість Url який має тип System.Web.Http.Routing.UrlHelper , який дозволяє побудувати URLs для контролерів API.

Приклад:

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

    ...
}

Цей UrlHelper не існує ні у ваших поглядах, ні в стандартних контролерах.


ОНОВЛЕННЯ:

А для того, щоб робити маршрутизацію поза ApiController, ви можете зробити наступне:

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

або всередині подання:

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

Зверніть увагу на httproute = ""важливий маркер маршруту.

Очевидно, це передбачає, що маршрут Api викликається DefaultApiу вашому методі RegisterRoutes у Global.asax:

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

Це .. насправді не дуже допомагає мені, оскільки мені потрібен мій погляд, щоб можна було безпечно створювати URL-адреси. Якщо є ліцензія Go Live, який спосіб "Перейти в прямому ефірі" для створення URL-адрес у Перегляді?
Шейн Кортрілль

Що ще важливіше, це не спрацює, якщо ви використовуєте сервер розвитку ASP.Net, оскільки він постійно змінює порти, тому ви навіть не можете переконати URL-адресу в області перегляду.
Шейн Кортрілль

@ShaneCourtrille, я оновив свою відповідь, щоб проілюструвати, як ти можеш використовувати нормальний System.Web.Mvc.UrlHelperдля генерування маршрутів Api поза межами HttpControllerContext.
Дарин Димитров

Дуже дякую! Я намагався використати RouteUrl, але не знав про параметр httproute param.
Шейн Кортріль

2
Я розумію мету вибірки; Я кажу, що це було б кориснішим зразком, якби ви кинули в один рядок коду ViewBag, тому що ви демонстрували б, що це значення - це те, до чого ми намагалися отримати, ймовірно, а не просто виконувати якийсь довільний код. Знову ж таки, я б не коментував, якби не витратив пару хвилин, не зрозумівши, що я пропустив, перш ніж нарешті визнав, що конкретний рядок коду є відповідним.
Джон Девіс

43

Він працює з більш простою формою, Url.Actionтому вам не доведеться посилатися на будь-які імена маршрутизації:

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

Ви можете додати ідентифікатор, area = ""якщо потрібна URL-адреса в межах області. (Контролери Api за замовчуванням знаходяться за межами областей.) Я використовую MVC 4.


7
UrlHelper в Web Api - це msdn.microsoft.com/en-us/library/… , у нього немає методу дії.
Юрій Факторович

8
@YuriyFaktorovich Це повідомлення передбачає, Url.Actionщо використовується з перегляду. Urlтипу System.Web.Mvc.UrlHelper, і він не відображає WebApiмаршрути. Ось чому вам потрібен додатковий параметр: new { httproute = "" }.
Джессі

3
Я додав, httproute""але це не відображення = /
Маслоу

Мені довелося додати посилання з порожньою областю та null htmlAttributes, @Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null) але це спрацювало чудово
Крістофер Г. Льюїс

2
Це прекрасно працює з точки зору, проте я не впевнений, чому він генерує ім'я дії у вигляді рядка запиту на зразок: / api / dashboard? Action = getdata. Я очікував цього: / api / dashboard / getdata
umutesen

7

Хочете мати можливість генерувати посилання на безпечний тип, без твердо кодованих рядків (назви контролерів)?

Для цього є обов'язок! (і це написав Марк Семан)

https://github.com/ploeh/Hyprlinkr

Працює так:

Маршрути, як завжди:

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

Отримайте URL-адресу:

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

Результат:

http://localhost/api/foo/1337

3

Ось метод KISS для відповіді на питання:

Якщо це код, який ви використовували б для створення URL-адреси контролера MVC

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

Для отримання URL-адреси для версії API контролера (якщо ви використовуєте те саме ім’я контролера) ви можете використовувати

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

Усі методи Url.Action - це додавання кореневого шляху програми з ім'ям контролера, а потім ім'ям дії (якщо тільки це "Index", в цьому випадку він не додається. Якщо об'єкт значень маршруту має ідентифікатор властивості, значення також додається до URL-адреси.


Дякую! Я не вистачав api/раніше, ніж моє ім'я контролера.
Даніель Конгроув
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.