Я хочу создать RESTful Json Api для своего приложения MVC3. Мне нужна помощь с обработкой нескольких Http-глаголов для работы с одним экземпляром объекта.
То, что я читал / изучал / пробовал
Атрибуты MVC ( HttpGet
, HttpPost
и т. Д.), Позволяют мне иметь контроллер с несколькими действиями с одинаковым именем , но у них все равно должны быть разные сигнатуры методов.
Ограничения маршрута возникают в модуле маршрутизации до того, как сработает MVC, что приведет к тому, что у меня будет 4 явных маршрута, и все же потребуются индивидуально именованные действия контроллера.
ASP.NET MVC AcceptVerbs и регистрация маршрутов
Создание настраиваемого атрибута Http Verb можно использовать для захвата команды, используемой для доступа к действию, и последующей передачи ее в качестве аргумента при вызове действия - тогда код будет обрабатывать случаи переключения. Проблема с этим подходом заключается в том, что для некоторых методов потребуется авторизация, которая должна обрабатываться на уровне фильтра действий, а не внутри самого действия.
http://iwantmymvc.com/rest-service-mvc3
Требования / Цели
Одна сигнатура маршрута для одного экземпляра объекта, MVC, как ожидается, будет обрабатывать четыре основных Http-глагола: GET, POST, PUT , УДАЛЯТЬ.
context.MapRoute ("Api-SingleItem", "items / {id}",
new {controller = "Items", action = "Index", id = UrlParameter.Optional}
);
Если в URI не передается параметр Id, действие должно обрабатывать POST
и PUT
.
общедоступный индекс JsonResult (элемент элемента) {return new JsonResult (); }
Когда параметр Id передается в URI, одно действие должно обрабатывать GET
и DELETE
.
общедоступный индекс JsonResult (int id) {return new JsonResult (); }
Вопрос
Как я могу иметь более одного действия (с одинаковым именем и подписью метода), каждое из которых отвечает на уникальный HTTP-глагол. Желаемый пример:
[HttpGet]
public JsonResult Index(int id) { /* _repo.GetItem(id); */}
[HttpDelete]
public JsonResult Index(int id) { /* _repo.DeleteItem(id); */ }
[HttpPost]
public JsonResult Index(Item item) { /* _repo.addItem(id); */}
[HttpPut]
public JsonResult Index(Item item) { /* _repo.updateItem(id); */ }