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.