Tôi đã tự hỏi ý kiến của mọi người về PUT
hoạt động RESTful không trả về gì (null) trong phần phản hồi.
Tôi đã tự hỏi ý kiến của mọi người về PUT
hoạt động RESTful không trả về gì (null) trong phần phản hồi.
Câu trả lời:
Đặc tả HTTP ( RFC 2616 ) có một số khuyến nghị có thể áp dụng. Đây là cách giải thích của tôi:
200 OK
cho PUT thành công của bản cập nhật cho tài nguyên hiện có. Không có cơ thể đáp ứng cần thiết. (Theo Mục 9.6 , 204 No Content
thậm chí còn phù hợp hơn.)201 Created
cho PUT thành công của tài nguyên mới, với URI cụ thể nhất cho tài nguyên mới được trả về trong trường tiêu đề Vị trí và mọi URI và siêu dữ liệu có liên quan khác của tài nguyên được lặp lại trong phần phản hồi. ( RFC 2616 Mục 10.2.2 )409 Conflict
cho PUT không thành công do sửa đổi lần thứ 3 , với một danh sách các khác biệt giữa bản cập nhật đã thử và tài nguyên hiện tại trong phần phản hồi. ( RFC 2616 Mục 10.4.10 )400 Bad Request
cho PUT không thành công, với văn bản ngôn ngữ tự nhiên (như tiếng Anh) trong phần phản hồi giải thích lý do tại sao PUT thất bại. ( RFC 2616 Mục 10.4 )No response body needed
liên quan đến 200. Trên thực tế, cơ quan phản hồi hoàn toàn không được đề cập liên quan đến PUT. Nó chỉ nêu rõIf an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to indicate successful completion of the request.
Trái ngược với hầu hết các câu trả lời ở đây, tôi thực sự nghĩ rằng PUT nên trả về tài nguyên được cập nhật (tất nhiên ngoài mã HTTP).
Lý do tại sao bạn muốn trả lại tài nguyên dưới dạng phản hồi cho hoạt động PUT là vì khi bạn gửi một đại diện tài nguyên đến máy chủ, máy chủ cũng có thể áp dụng một số xử lý cho tài nguyên này, vì vậy khách hàng muốn biết tài nguyên này như thế nào hình như sau khi yêu cầu hoàn thành (nếu không, nó sẽ phải đưa ra một yêu cầu GET khác).
Tôi nghĩ rằng máy chủ có thể trả về nội dung để phản hồi lại PUT. Nếu bạn đang sử dụng định dạng phong bì phản hồi cho phép dữ liệu được tải xuống (chẳng hạn như định dạng được sử dụng bởi dữ liệu ember), thì bạn cũng có thể bao gồm các đối tượng khác có thể đã được sửa đổi thông qua kích hoạt cơ sở dữ liệu, v.v. (Dữ liệu được tải xuống rõ ràng để giảm # yêu cầu và đây có vẻ là một nơi tốt để tối ưu hóa.)
Nếu tôi chỉ chấp nhận PUT và không có gì để báo cáo lại, tôi sử dụng mã trạng thái 204 không có phần thân. Nếu tôi có điều gì đó để báo cáo, tôi sử dụng mã trạng thái 200 và bao gồm một phần thân.
Thông số HTTP / 1.1 (phần 9.6) thảo luận về mã phản hồi / lỗi thích hợp. Tuy nhiên, nó không giải quyết nội dung phản hồi.
Bạn mong đợi điều gì? Một mã phản hồi HTTP đơn giản (200, v.v.) có vẻ đơn giản và không rõ ràng đối với tôi.
Nếu phần cuối của API REST là cơ sở dữ liệu quan hệ SQL, thì
Nếu bạn không quan tâm đến các cập nhật bị mất hoặc nếu bạn muốn buộc khách hàng của mình thực hiện NHẬN ngay sau khi PUT, thì đừng trả lại bất cứ điều gì từ PUT.
Mã phản hồi của năm 201 cho "Đã tạo" cùng với tiêu đề "Vị trí" để chỉ đến nơi khách hàng có thể tìm thấy tài nguyên mới được tạo.
Tôi đã sử dụng API RESTful trong các dịch vụ của mình và đây là ý kiến của tôi: Đầu tiên chúng ta phải có một chế độ xem chung PUT
được sử dụng để cập nhật một tài nguyên không tạo hoặc nhận.
Tôi đã xác định tài nguyên với: Stateless resource
và Stateful resource
:
Tài nguyên không trạng thái Đối với các tài nguyên này, chỉ cần trả lại Mã nguồn với phần thân trống, thế là đủ.
Tài nguyên trạng thái Ví dụ: phiên bản của tài nguyên. Đối với loại tài nguyên này, bạn phải cung cấp phiên bản khi bạn muốn thay đổi nó, vì vậy hãy trả lại toàn bộ tài nguyên hoặc trả lại phiên bản cho khách hàng, vì vậy khách hàng không cần gửi yêu cầu nhận sau hành động cập nhật.
Nhưng , đối với một dịch vụ hoặc hệ thống, giữ nósimple
,clearly
,easy to use and maintain
là điều quan trọng nhất.
Giống như một cơ quan Yêu cầu trống phù hợp với mục đích ban đầu của yêu cầu GET và cơ quan phản hồi trống phù hợp với mục đích ban đầu của yêu cầu PUT.
có vẻ ổn ... mặc dù tôi nghĩ rằng một dấu hiệu thô sơ về thành công / thất bại / thời gian được đăng / # byte nhận được / v.v. sẽ thích hợp hơn
chỉnh sửa: Tôi đã suy nghĩ theo dòng toàn vẹn dữ liệu và / hoặc lưu giữ hồ sơ; siêu dữ liệu như hàm băm MD5 hoặc dấu thời gian cho thời gian nhận được có thể hữu ích cho các tệp dữ liệu lớn.
Lý tưởng nhất là nó sẽ trả về một phản ứng thành công / thất bại.
Có một sự khác biệt giữa tiêu đề và nội dung của phản hồi HTTP. PUT không bao giờ nên trả lại phần thân, nhưng phải trả về mã phản hồi trong tiêu đề. Chỉ cần chọn 200 nếu thành công và 4xx nếu không. Không có thứ gọi là mã trả về null. tại sao bạn muốn làm việc này?
200
PUT, DELETE hoặc bất kỳ phương pháp nào khác. Tôi đã bỏ lỡ một cái gì đó? Chẳng hạn như Mozilla trở thành ông chủ của W3 và IETF? ;) Hoặc có thể họ chưa bao giờ nghe nói về Nguyên tắc Mạnh mẽ của Postel.