2008-09-23 17 views
7

Có một mô hình cụ thể mà các nhà phát triển thường theo dõi không? Tôi chưa bao giờ thực sự cho nó nhiều suy nghĩ trước đây trong các ứng dụng web của tôi, nhưng động cơ định tuyến ASP.NET MVC khá nhiều buộc bạn ít nhất phải cân nhắc nó.Làm cách nào để cấu trúc các tuyến đường URL của bạn?

Cho đến nay tôi đã thích cấu trúc bộ điều khiển/hành động/chỉ mục (ví dụ: Sản phẩm/Chỉnh sửa/1), nhưng tôi đang gặp khó khăn với các url phức tạp hơn. Ví dụ:

Ví dụ: giả sử bạn có một trang liệt kê tất cả các sản phẩm mà người dùng có trong tài khoản của họ. Bạn sẽ làm điều này như thế nào? Trên đầu của tôi, tôi có thể nghĩ đến các khả năng sau đây cho trang danh sách và trang chỉnh sửa:

  1. Người dùng/{id người dùng}/Sản phẩm/Danh sách, Người dùng/{id người dùng}/Sản phẩm/Chỉnh sửa/{product id}
  2. Người dùng/{id người dùng}/Sản phẩm, Người dùng/{id người dùng}/Sản phẩm/{product id}
  3. Sản phẩm? UserID = {user id}, Sản phẩm/Chỉnh sửa/{product id}

Tôi chắc chắn có rất nhiều người khác mà tôi đang thiếu. Lời khuyên nào?

Trả lời

7

Tôi thích URL RESTful, thân thiện với người dùng và có thể tấn công.

Điều này có nghĩa là gì? Hãy bắt đầu với URL thân thiện với người dùng. Với tôi, một URL thân thiện với người dùng là một thứ dễ gõ và dễ nhớ /Default.aspx?action=show&userID=140 không đáp ứng được bất kỳ yêu cầu nào trong số này. Một URL như `/ users/troethom 'có vẻ hợp lý.

Điều này dẫn đến điểm tiếp theo. URL có thể hack là URL mà người dùng có thể sửa đổi và vẫn nhận được kết quả. Nếu URL có thể bị tấn công và URL cho tiểu sử của tôi là /users/troethom thì việc xóa tên người dùng của mình là an toàn để có danh sách người dùng (/users).

Sử dụng URL RESTful khá giống với ý tưởng đằng sau các đề xuất khác của tôi. Bạn đang thiết kế URL cho người dùng chứ không phải cho máy và do đó URL phải liên quan đến nội dung chứ không phải là phần cuối kỹ thuật của trang web của bạn. Một URL là '/ người dùng' có ý nghĩa hơn ´/người dùng/danh sách 'và URL là'/category/programming/javascript '(đại diện cho tiểu thể loại' javascript 'trong danh mục' lập trình 'tốt hơn ´/category/show/12'.

nó thực sự là khó khăn hơn để bỏ qua ID, nhưng trong thế giới của tôi nó là giá trị các nỗ lực.

Ngoài ra tham khảo ý kiến ​​the Understanding URIs section trên W3C's Common HTTP Vấn đề thực hiện.Nó có một danh sách các cạm bẫy phổ biến khi thiết kế URI. Một tài nguyên tốt khác là Resourceful Vs Hackable Search URLs.

1

Ngoài ra, bạn có thể cân nhắc sử dụng các động từ khác nhau để sử dụng lại các tuyến đường tương tự cho các hành động khác nhau. Ví dụ: yêu cầu GET cho "Sản phẩm/Chỉnh sửa/45" sẽ hiển thị trình chỉnh sửa sản phẩm, trong khi POST gửi đến cùng một url sẽ cập nhật sản phẩm. Bạn có thể sử dụng thuộc tính AcceptVerb để thực hiện điều này:

[AcceptVerb("GET")] 
public ActionResult Edit(int id) 
{ 
    ViewData["Product"] = _products.Get(id); 
    return View(); 
} 

[AcceptVerb("POST")] 
public ActionResult Edit(int id, string title, string description) 
{ 
    _products.Update(id, title, description); 
    TempData["Message"] = "Changes saved successfully!"; 

    return RedirectToAction("Edit", new { id }); 
} 
0

Để thêm vào ý kiến ​​troethom của, RESTful thường cũng có nghĩa là, ví dụ, để tạo một người dùng mới, bạn sẽ PUT một đại diện đến/người dùng/NewUserName

RESTful cơ bản sử dụng 5 phương pháp HTTP chuẩn (GET, PUT , POST, DELETE, HEAD) để kiểm soát/truy cập nội dung.

Ok, điều này là không dễ dàng đối với một trình duyệt web, nhưng bạn luôn có thể sử dụng POST quá tải (đường bưu điện đến/người dùng/tên người dùng với một đại diện của một người dùng thay đổi một số chi tiết, vv

của nó một cách hay để làm việc, tôi xin đọc lại số RESTFul Web services để hiểu rõ hơn: D (và đó là một cuốn sách hay!)

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