2010-04-20 5 views
8

Đây là một câu hỏi tiếp theo cho this one.Một URI đã cho trong kiến ​​trúc RESTful có luôn trả về cùng một phản hồi không?

Vì vậy, có một phản ứng duy nhất cho bất kỳ URI cụ thể nào là đối tượng thuê lõi của kiến ​​trúc RESTful? Rất nhiều cuộc thảo luận ở đây có xu hướng đó, nhưng tôi đã không nhìn thấy nó ở bất cứ nơi nào như là một quy tắc "cứng và nhanh".

Tôi hiểu giá trị của nó (để lưu vào bộ nhớ cache, thu thập thông tin, chuyển liên kết, v.v.), nhưng tôi cũng thấy những thứ như API twitter vi phạm (Yêu cầu http://api.twitter.com/1/statuses/friends_timeline.xml sẽ thay đổi dựa trên tên người dùng) và tôi hiểu có những lúc cần thiết - không kể rằng tài nguyên được phân trang theo thứ tự thời gian cũng sẽ thay đổi khi các phần tử mới được thêm vào.

Tôi có nên cố gắng trả lời các câu trả lời khác nhau từ cùng một URI hay không, và tôi chấp nhận rằng đôi khi nó không thực tế, và miễn là tôi giảm thiểu sự xuất hiện của nó, tôi sẽ có hình dạng tốt.

+2

Quy tắc REST số 1. Không bao giờ sử dụng API Twitter làm hướng dẫn ;-) –

+0

Touché;) ... Tôi đoán câu hỏi ngụ ý là liệu RESTful có phải là một trạng thái boolean hay một thang trượt. Rất nhiều ứng dụng "tên lớn" bẻ cong hoặc phá vỡ một số quy tắc, nhưng vẫn tự gọi mình là "RESTful". – keithjgrant

Trả lời

2

Không có phản hồi tương tự, nhưng biểu diễn (phụ thuộc vào tiêu đề yêu cầu kết hợp và có điều kiện) của cùng một tài nguyên. Trong Kiến trúc phần còn lại, một URI xác định một và chỉ một tài nguyên (nhưng một tài nguyên có thể có một số URI). Trình bày tài nguyên khác nhau tùy thuộc vào người dùng được ủy quyền (là HTTP Auth, cookies, ...) là thực hành không tốt, vì cùng một URI đại diện cho một tài nguyên khác nhau cho mỗi người dùng, như trong ví dụ Twitter. Tôi không thể cho phép bạn xem dòng thời gian của mình và cung cấp cho bạn URI, vì đây là cùng một URI cho dòng thời gian của bạn. Người dùng phải được mã hóa trong URI và quyền truy cập bị giới hạn bởi ủy quyền phân quyền. Để có một điểm truy cập duy nhất hiển thị tài nguyên khác nhau tùy thuộc vào người dùng được xác thực, hãy sử dụng chuyển hướng (ví dụ: 303 Xem Khác, 302 Đã tìm thấy, ...)

+1

Bạn có bất kỳ tham chiếu nào cho tuyên bố 'thực hành không tốt' của mình không? Hoàn toàn hợp pháp để trả lại nội dung khác nhau dựa trên người dùng đã đăng nhập. Ví dụ, tôi có thể định nghĩa một URL shortcut '/ my/things' trả về mọi thứ cho người dùng đã đăng nhập và trả về phản hồi với tiêu đề' Content-Location' được đặt thành '/ users/123/things' để chỉ ra vị trí chuẩn cho tài nguyên đó (xem RFC 2616 phần 14.14) –

+2

nếu/my/things và/users/123/things được cho là đại diện cho cùng một tài nguyên thì chỉ có một cái nên trả về 200, cái còn lại sẽ trả về 303 See Other. –

+0

Nội dung-Vị trí nên được sử dụng để cung cấp URI của biến thể được trả về của tài nguyên (đại diện khác, ví dụ: conneg) hoặc trả về tài nguyên đã tạo trong trường hợp POST (thay vì sử dụng 201 + Vị trí, sau này là rigourus hơn). Trong trường hợp bạn đang trình bày, đó là một tài nguyên khác. Bạn không thể đảm bảo tài nguyên mà khách hàng sẽ truy xuất bằng cách GET URI này. Nếu UA là một trình duyệt, bạn không thể sao chép/qua URI, vì Nội dung-Vị trí không thể truy cập trực tiếp. URI là mã định danh tài nguyên, đó là chúng xác định một tài nguyên, luôn giống nhau (xem sect.5.2 của Roy luận án) –

0

Không có gì trong REST nói cùng một câu trả lời - nhưng bạn shuld được chuẩn bị để xử lý những thứ như "Nếu thay đổi Kể từ khi" tiêu đề yêu cầu khi họ làm SENSE;)

API tritter có các vấn đề khác, rõ ràng - như trong: đây là một quyết định thiết kế. Ví dụ: khi bạn cho phép thời gian bạn bè bị cô lập, việc đặt dòng thời gian bên dưới phần tử tên người bạn có ý nghĩa - họ rõ ràng đã quyết định chống lại điều này;)

Nó chạy xuống quyết định thiết kế. Nhìn vào OData (như http://odata.netflix.com/Catalog/) - ở đây nó làm cho snse trả về cùng một dữ liệu cho mỗi URL trong một thời gian nhất định (bộ nhớ đệm), bởi vì nó là một cataloque hoàn toàn công khai. Đối với các kịch bản khác, nó có thể không có ý nghĩa.

0

Một số tiêu đề yêu cầu làm thay đổi những gì được trả lại (trong khi vẫn RESTful):

  1. Rõ ràng bộ nhớ cache-tiêu đề dự kiến ​​sẽ được sử dụng để xác định xem một 304 hoặc 200 được trả về
  2. Các Accept tiêu đề có thể được sử dụng để xác định định dạng của phản hồi (HTML vs XML so với JSON)
  3. Đầu trang Authorized ít nhất có thể xác định nếu 401, 403 hoặc 200 được trả lại.
  4. Ngoài ra, tài nguyên được phép thay đổi theo thời gian.

Câu hỏi thực sự là liệu tiêu đề Authorized (xác định người dùng) có thể được sử dụng để thay đổi nội dung phản hồi hay không. Tôi chưa thấy bất kỳ tuyên bố chính thức nào về nó, nhưng tôi nghi ngờ một số người muốn có người dùng trong URL và tiêu đề Authorized được sử dụng để xác thực quyền truy cập. Tôi nghi ngờ một trong hai cách vẫn là RESTful.

+1

Câu hỏi đặt ra là, có bao nhiêu bộ đệm trung gian có thể xử lý các biến thể phản hồi dựa trên tiêu đề auth. Nếu bộ nhớ đệm không quan trọng đối với một ứng dụng cụ thể thì có thể sử dụng một url duy nhất là ok. Nhưng tại sao lại mạo hiểm? –