2012-01-04 36 views
10

Kết quả là previous question của tôi, tôi đã phát hiện ra hai cách xử lý các tuyến REST trong MVC3.MVC3 REST Route & Http Verbs

Đây là câu hỏi tiếp theo mà tôi đang cố gắng tìm hiểu sự khác biệt thực tế/sự tinh tế giữa hai cách tiếp cận này. Tôi đang tìm kiếm câu trả lời có thẩm quyền nếu có thể.

Phương pháp 1: Độc thân Route, với hành động Tên + Http Động từ thuộc tính trên điều khiển Actions

  1. Đăng ký một tuyến đường duy nhất trong Global.asax sử dụng một quy định action tham số.

    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" }); 
    } 
    
  2. Áp dụng cả ActionNameHttpVerb thuộc tính để điều khiển hành động

    [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);); 
    } 
    

Phương pháp 2: Các tuyến đường độc đáo + Hạn chế Verb, với Http Động từ thuộc tính trên điều khiển Actions

  1. ký các tuyến đường duy nhất trong Global.asax với 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") }); 
    
  2. Chỉ sử dụng một Http Động từ thuộc tính trên Actions khiển

    [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);); 
    } 
    

Cả hai phương pháp cho tôi đã được đặt tên duy nhất điều khiển phương pháp hành động, và cho phép các tuyến đường RESTful được gắn với các động từ ... nhưng những gì vốn đã khác nhau về việc hạn chế tuyến đường so với sử dụng tên hành động proxy?

Trả lời

0

Tôi không biết rằng bạn sẽ bao giờ tìm thấy câu trả lời có thẩm quyền, nhưng tôi sẽ đưa ra ý kiến ​​của tôi và bạn có thể nói theo quan điểm của tôi, ý kiến ​​của tôi quan trọng ;-). Tôi nghĩ rằng tùy chọn đầu tiên là tinh khiết hơn, tuy nhiên kinh nghiệm của tôi đã được rằng các phương pháp trợ giúp như Url.Action() đôi khi có thể gặp khó khăn trong việc giải quyết các tuyến đường chính xác với phương pháp này và tôi đã đưa đến phương pháp thứ hai vì nó thực sự chỉ có ngụ ý nội bộ như api trông giống hệt với người tiêu dùng.

1

Bạn sẽ không nhận được một câu trả lời có thẩm quyền bởi đây là 2 xu của tôi:

tôi thích phương pháp 2 vì sau đó bạn có tất cả định tuyến của bạn ở một nơi. Bạn có thể đóng gói định tuyến của mình thành một phương pháp, ví dụ: MapResourceRoutes(string controller, string uri) và sử dụng thời gian muptiple trong suốt API của bạn.

Phương pháp 2 cung cấp cho bạn các tuyến đường được đặt tên rõ ràng mà bạn có thể sử dụng để liên kết và định tuyến ngược.

0

Tại thời điểm này, câu trả lời đúng là sử dụng API Web.

Các vấn đề liên quan