Веб-API ASP.NET 2 — определить сопоставление контроллера и метода?

У Microsoft есть хорошее руководство по запуску вашего первого проекта веб-API ASP.NET:

http://www.asp.net/web-api/overview/начало-работы-с-aspnet-web-api/tutorial-ваш-первый-web-api

... но что мне неясно - как определяется сопоставление между URI API и моими методами контроллера C #?

например:

/api/products/{id}

решает

public IHttpActionResult GetProduct(int id)
{
    [...]
}

... но я не уверен, как это сделать. автоматический?

Я спрашиваю, потому что хочу создать новое сопоставление для этого URI:

/api/setReportNotificationsAsRead?uid={username}&items={itemIDs}

к этому новому методу в моем контроллере:

public IHttpActionResult SetReportNotificationsAsRead(string username, string itemIDs)
{
    [...]
}

person mdelvecchio    schedule 30.05.2014    source источник


Ответы (2)


...but im not sure how. automagic?

Automagic лежит в HTTP-глаголах в веб-API. Маршрут /api/products/{id} может сопоставляться с чем угодно, что начинается с GET (или просто с именем метода Get), если вы делаете запрос GET для WebAPI.

Если вы делаете запрос POST, он будет отображаться на любой метод POST (или вы используете префикс маршрута).

Эта ссылка может помочь вам понять магию. Это также может помочь вам понять, как настроить вызов функции SetReportNotificationsAsRead.

person Guanxi    schedule 02.06.2014
comment
как вы думаете, вы могли бы помочь мне с этим вопросом post-instead-of-put-and-del/24235652#24235652" title="asp net web api какие проблемы могут возникнуть, если я использую post вместо put и del"> stackoverflow.com/questions/24235617/ - person eddy; 16.06.2014

Вы очень близки к рабочему решению. У вас перепутаны имена параметров метода:

public IHttpActionResult SetReportNotificationsAsRead(string uid, string items)
{
    //Do your stuff!
}

Имя параметра HTTP GET должно совпадать с именем параметра метода. Это часть соглашения об именовании ASP.NET MVC.

И последнее замечание: если вы на самом деле ожидаете группу элементов (т. е. несколько идентификаторов элементов), вы можете сэкономить некоторую работу и использовать параметр string[], если ваши параметры HTTP отправляются правильно. В этом случае вы бы хотели, чтобы URI выглядел так: /api/setReportNotificationsAsRead?items=123&items=456&items=789. Обратите внимание, что имя параметра повторяется несколько раз, но с разными значениями.

Для получения дополнительной информации о системе маршрутизации я бы посоветовал обратиться к Обзор маршрутизации ASP.NET MVC.

person Justin Helgerson    schedule 30.05.2014
comment
ах да, поэтому параметры строки запроса URI должны точно соответствовать именам параметров метода. понятно. есть ли какие-либо другие жесткие сопоставления, или вы просто делаете их, гарантируя совпадение имен URI и API? плохо читал вашу ссылку, наверное, говорит... интересно по опции string[]. будет оценивать. db в конечном итоге принимает простой XML из ‹Items›‹id›1‹/id›‹id›2‹/id›‹/Items›, поэтому я могу либо передать это в API, либо создать его внутри метода API. ... - person mdelvecchio; 31.05.2014
comment
@mdelvecchio — по умолчанию вы можете увидеть, как настроены маршруты вашего приложения, просмотрев файл RouteConfig.cs. Поскольку похоже, что вы используете Web API 2, вы можете даже пойти дальше и определить маршруты для каждого метода с атрибутами. - person Justin Helgerson; 31.05.2014
comment
спасибо - использование атрибутов Web API 2, безусловно, для меня. было довольно легко использовать [декораторы] для определения URI над методом контроллера ... вуаля, сопоставлено. проще, чем работать в RouteConfig.cs. - person mdelvecchio; 05.06.2014