Phiên bản ngắn của câu hỏi:
Không "NHẬN" tại một URI cụ thể cần khớp với "PUT" với URI đó không?Câu hỏi REST: PUT một biểu diễn, NHẬN một biểu diễn khác?
Tôi nghĩ là không. Đây là lý do:
Cho rằng tài nguyên là một điều trừu tượng về mặt lý thuyết mà khách hàng không thể biết được, khi chúng tôi thực hiện PUT, chúng tôi phải chỉ gửi một đại diện. Dựa trên việc chải trên RFC2616, nó dường như không được chỉ định hoàn toàn về ý nghĩa của một tài nguyên có nhiều biểu diễn (có khả năng vô hạn?), Nhưng đây là những suy nghĩ của tôi; vui lòng cho tôi biết nếu bạn đồng ý:
Kỳ vọng của tôi là nếu tôi PUT đại diện cho tài nguyên, tất cả các đại diện khác của tài nguyên tại URI đó phải được giữ nhất quán (có thể cập nhật) nếu cần. Nói cách khác, bạn đang nói với tài nguyên "sử dụng biểu diễn này để xác định lại chính mình".
Vì vậy, tôi sẽ có thể làm điều này:
PUT/nguồn/foo/myvacation
Content-type: image/jpg
...
Và theo dõi với điều này:
GET/resources/foo/myvacation
Chấp nhận: image/png
...
và nhận được phiên bản cập nhật của myvacation trong một định dạng khác nhau (giả sử máy chủ biết làm thế nào để làm điều đó). Ngoại suy từ đó, hỗn hợp nguyên tử "hình ảnh + siêu dữ liệu" PUT này cũng nên được quy phạm pháp luật:
PUT/nguồn/foo/myvacation
Content-type: multipart/form-dataContent-disposition: dạng dữ liệu; name = "document"
Loại nội dung: hình ảnh/jpg
[..]
Bố cục nội dung: biểu mẫu-dữ liệu; name = "iptc"
Loại nội dung: application/iptc
[..]
Bố cục nội dung: biểu mẫu-dữ liệu; name = "exif"
Content-type: application/exif
[..]
Và sau đó, vì đàm phán nội dung server-side (RFC2616 phần 12.1) có thể xảy ra dựa trên chỉ là về bất cứ điều gì, chúng tôi có thể mặc định là "tài liệu" nội dung cho việc này:
GET/nguồn/foo/myvacation
Content-type: image/jpg
[..]
hoặc nếu bạn tin rằng tôi làm điều đó RFC 2396 phần 3.4 "Thành phần truy vấn là một chuỗi thông tin được giải thích bởi tài nguyên." có nghĩa là một URI có chuỗi truy vấn tham chiếu đến cùng một tài nguyên như một URI không có chuỗi truy vấn (và là đẳng cấu với chỉ gửi dữ liệu được mã hóa ứng dụng/x-form-url) vào tài nguyên), thì điều này cũng hợp pháp:
GET/nguồn/foo/myvacation content = exif
Content-type: application/exif
[..]
các mô tả về PUT nói:
yêu cầu phương phápcác PUT rằng kèm theo d thực thể được lưu trữ theo Yêu cầu-URI.
Với tôi, điều này là khá chống REST, trừ khi bạn đọc nó theo cách rất tự do. Giải thích của tôi là "Phương thức PUT yêu cầu một tài nguyên được tạo hoặc cập nhật tại Yêu cầu-URI được cung cấp dựa trên sự biểu diễn của thực thể đính kèm."
Sau đó, chúng tôi nhận được:
Sự khác biệt cơ bản giữa POST và PUT yêu cầu được phản ánh trong ý nghĩa khác nhau của Request-URI. URI trong yêu cầu POST xác định tài nguyên sẽ xử lý thực thể được đính kèm. Tài nguyên đó có thể là một quá trình chấp nhận dữ liệu, một cổng vào một số giao thức khác hoặc một thực thể riêng biệt chấp nhận các chú thích. Ngược lại, URI trong một yêu cầu PUT xác định thực thể kèm theo yêu cầu - tác nhân người dùng biết URI là gì và máy chủ PHẢI KHÔNG cố gắng áp dụng yêu cầu cho một số tài nguyên khác.
Chúng ta cần đọc tương tự điều này một cách sáng tạo, nhưng các bit chính ở đây là "biết URI là gì" và "áp dụng yêu cầu". Vì vậy, với tôi, biểu diễn được trả về bởi GET tại một URI đã cho không nhất thiết phải giống như biểu diễn PUT cho URI đã cho, nó chỉ phải nhất quán.
Đúng hay sai?
Gần đây tôi đã phát hiện ra rằng RFC2616 đã được thay thế bằng RFC3986, xác định truy vấn sao cho nó có thể được sử dụng để định vị tài nguyên. Tôi không chắc tôi thích định nghĩa mới này. : -/ –