MVC3 REST Routes & Http Verbs
В результате предыдущего вопроса я обнаружил два способа обработки маршрутов REST в MVC3.
Это следующий вопрос, когда я пытаюсь узнать фактические различия/тонкости между этими двумя подходами. Я смотрю на авторитетный ответ, если это возможно.
Метод 1: Одиночный маршрут с именем действия + Атрибуты Http-глагола по действиям контроллера
-
Зарегистрируйте один маршрут в Global.asax
с помощью указанного параметра action
.
public override void RegisterArea(AreaRegistrationContext context)
{
// actions should handle: GET, POST, PUT, DELETE
context.MapRoute("Api-SinglePost", "api/posts/{id}",
new { controller = "Posts", action = "SinglePost" });
}
-
Применить атрибуты ActionName
и HttpVerb
к действиям контроллера
[HttpGet]
[ActionName("SinglePost")]
public JsonResult Get(string id)
{
return Json(_service.Get(id));
}
[HttpDelete]
[ActionName("SinglePost")]
public JsonResult Delete(string id)
{
return Json(_service.Delete(id));
}
[HttpPost]
[ActionName("SinglePost")]
public JsonResult Create(Post post)
{
return Json(_service.Save(post));
}
[HttpPut]
[ActionName("SinglePost")]
public JsonResult Update(Post post)
{
return Json(_service.Update(post););
}
Метод 2: уникальные маршруты + ограничения глаголов, с атрибутом Http-глагола в действиях контроллера
-
Зарегистрируйте уникальные маршруты в Global.asax
с помощью HttpMethodContraint
var postsUrl = "api/posts";
routes.MapRoute("posts-get", postsUrl + "/{id}",
new { controller = "Posts", action = "Get",
new { httpMethod = new HttpMethodConstraint("GET") });
routes.MapRoute("posts-create", postsUrl,
new { controller = "Posts", action = "Create",
new { httpMethod = new HttpMethodConstraint("POST") });
routes.MapRoute("posts-update", postsUrl,
new { controller = "Posts", action = "Update",
new { httpMethod = new HttpMethodConstraint("PUT") });
routes.MapRoute("posts-delete", postsUrl + "/{id}",
new { controller = "Posts", action = "Delete",
new { httpMethod = new HttpMethodConstraint("DELETE") });
-
Используйте только атрибут Http-глагола в действиях контроллера
[HttpGet]
public JsonResult Get(string id)
{
return Json(_service.Get(id));
}
[HttpDelete]
public JsonResult Delete(string id)
{
return Json(_service.Delete(id));
}
[HttpPost]
public JsonResult Create(Post post)
{
return Json(_service.Save(post));
}
[HttpPut]
public JsonResult Update(Post post)
{
return Json(_service.Update(post););
}
Оба эти метода позволяют мне иметь уникальные методы действий контроллера и разрешать маршруты RESTful, привязанные к глаголам... но что по сути отличается от ограничения маршрута и использования имени действия прокси?
Ответы
Ответ 1
Вы не получите авторитетного ответа, вот мои 2 цента:
Я предпочитаю метод 2, потому что тогда у вас есть вся ваша маршрутизация в одном месте. Вы можете инкапсулировать свою маршрутизацию в метод, например. MapResourceRoutes(string controller, string uri)
и использовать его в течение всего вашего API.
Также метод 2 дает вам четко обозначенные маршруты, которые вы можете использовать для связывания и обратной маршрутизации.
Ответ 2
Я не знаю, что вы когда-нибудь найдете авторитетный ответ, но я предложу свое мнение, и, как вы можете судить по моим пунктам, мое мнение имеет значение;-). Мой пурист сам считает, что первый вариант более чист, однако мой опыт заключается в том, что вспомогательные методы, такие как Url.Action(), иногда могут иметь проблемы с решением правильного маршрута с помощью этого подхода, и я перешел ко второму методу, поскольку он действительно только последствия внутри, поскольку api выглядит идентично потребителю.
Ответ 3
В этот момент правильным ответом является использование Web API.