2009-12-22 37 views
6

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-data

Content-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áp

cá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?

+0

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. : -/ –

Trả lời

1

Nếu bạn đang chuyển đổi thì điều quan trọng là những gì bạn PUT không phải là những gì bạn GET, vì vậy tôi không thấy lý do tại sao nó là một vấn đề.

Nhưng, nếu bạn PUT người dùng có thông tin nhất định thì khi bạn sử dụng GET thì nó sẽ truy xuất người đó, giống như khi tôi đặt ảnh nghỉ thứ 4, khi tôi gọi GET Tôi mong đợi ảnh đó nhưng có thể được chuyển đổi bằng cách chuyển đổi sang một định dạng khác, hoặc có một số biến đổi khác, nhưng, nếu tôi nhận được ảnh thứ 5 thay vào đó, thì đó là một vấn đề.

5

Dựa trên thực tế rằng thương lượng nội dung có thể trả về các biểu diễn khác nhau từ cùng một URI, tôi khá chắc chắn rằng những gì bạn PUT không phải giống như những gì bạn truy xuất.

+0

Khá đúng. Sử dụng tiêu đề Content-type hoàn toàn hợp pháp để POST một đối tượng XML, và sau đó GET một biểu diễn JSON hoặc XHTML trở lại. Các phép biến đổi như vậy làm cho việc sử dụng API Restful của bạn trở nên đơn giản hơn trong nhiều ứng dụng khác nhau. –

+0

@ Darrel - Tôi đồng ý, mặc dù trường hợp GET không được thực hiện khiến tôi cảm thấy hơi có lỗi về điều đó. Tôi dựa vào "thương lượng phía máy chủ có thể sử dụng bất kỳ tiêu chí nào nó muốn" khoản, mà cảm thấy squishier hơn tôi muốn. @Lars - POST là một con thú khác. Định nghĩa của PUT bị hạn chế nhiều hơn, do đó câu hỏi của tôi. –

3

Giả định của bạn là chính xác. GET không nhất thiết phải trả về cùng một biểu tượng như những gì bạn PUT, nhưng nó phải là cùng một tài nguyên .

Tôi hiện đang làm việc trên một ứng dụng web sẽ trả về bất kỳ tài nguyên nào dưới dạng XHTML, JSON hoặc phương ngữ XML tùy chỉnh, tùy thuộc vào những gì bạn yêu cầu trong tiêu đề thương lượng nội dung. Vì vậy, một trình duyệt sẽ thấy HTML theo mặc định.Các máy khách HTTP khác, bao gồm XMLHttpRequest, có thể nhận được JSON, v.v. Chúng là tất cả các biểu diễn của cùng một tài nguyên tại cùng một URI.

Tương tự như vậy, ứng dụng của chúng tôi sẽ chấp nhận một PUT hoặc POST trong bất kỳ các định dạng được hỗ trợ (tùy thuộc vào ngữ nghĩa của các nguồn lực cụ thể hoặc bộ sưu tập trong câu hỏi.)

2

Tôi đồng ý với câu trả lời khác mà tài nguyên mà bạn PUT không bắt buộc phải giống với cái mà bạn sau đó GET. Tôi muốn thêm một số kinh nghiệm của tôi cho câu hỏi này xung quanh khu vực này.

Bạn cần phải rất cẩn thận khi dựa vào thương lượng nội dung. Nó là rất khó khăn để có được quyền và nếu bạn không nhận được nó dẫn đến vấn đề người dùng khó chịu. Hãy làm ví dụ dựa trên hình ảnh ...

Nếu Alice đặt ảnh ở định dạng thô, sau đó Bob có thể NHẬN hình ảnh dưới dạng jpeg (thông qua chuyển đổi raw-> jpeg phía máy chủ) và Alice có thể TẢI hình ảnh ở định dạng thô; Không vấn đề gì. Tuy nhiên, nếu Bob PUTs một jpeg, thì không có cách nào để lấy lại định dạng thô cho Alice. Trong trường hợp hình ảnh kỳ nghỉ, việc thiếu các biến đổi đối xứng có thể không phải là một vấn đề lớn, nhưng trong các hình ảnh y khoa thì nó sẽ là như vậy.

Một khu vực khác mà thiếu sự biến đổi đối xứng cắn bạn đang ở trong các biểu diễn trong đó có một lược đồ và cái kia thì không. Trong trường hợp này, ở phía máy chủ, bạn sẽ đưa ra các quy ước về cách chuyển đổi giữa chúng. Nhưng bạn gặp phải những vấn đề lớn khi bạn xử lý các tài liệu với các lược đồ thay đổi theo thời gian và nằm ngoài tầm kiểm soát của bạn. Mỗi khi lược đồ thay đổi, bạn phải cập nhật tất cả các biến đổi của mình cho hình dạng lược đồ mới, trong khi vẫn hỗ trợ tài nguyên bằng lược đồ cũ. Thương lượng nội dung nhanh chóng trở nên rắc rối hơn giá trị của nó ngoại trừ một số trường hợp hạn chế. Một trong những lĩnh vực mà nó có thể quản lý được là nếu bạn kiểm soát hoàn toàn việc trình bày tài nguyên và lược đồ cơ bản của nó. Một lĩnh vực khác là nếu các định dạng tài nguyên là các tiêu chuẩn và có thể tạo ra các phép biến đổi đối xứng giữa các định dạng khác nhau.

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