Những cuộc gọi REST PUT / POST / DELETE nào sẽ trả về theo quy ước?


153
  1. Theo "hệ tư tưởng REST", những gì cần có trong cơ thể phản hồi cho các yêu cầu PUT / POST / DELETE?

  2. Còn mã trả lại thì sao? Là HTTP_OKđủ?

  3. Lý do cho các công ước như vậy, nếu có là gì?

Tôi đã tìm thấy một bài viết hay mô tả sự khác biệt của POST / PUT: POST so với PUT Nhưng nó vẫn không trả lời câu hỏi của tôi.

Câu trả lời:


130

Tha thứ cho flippancy, nhưng nếu bạn đang thực hiện REST qua HTTP thì RFC7231 mô tả chính xác hành vi nào được mong đợi từ GET, PUT, POST và DELETE.

Cập nhật (ngày 3 tháng 7 năm 14): Thông số
HTTP cố ý không xác định nội dung được trả về từ POST hoặc DELETE. Thông số kỹ thuật chỉ xác định những gì cần được xác định. Phần còn lại là tùy thuộc vào người thực hiện để lựa chọn.


9
@tuxslayer Tôi rất vui vì bạn đã không nghĩ rằng tôi chỉ đang cố gắng để trở nên lén lút. Nhiều người dường như nghĩ rằng REST bổ sung các yêu cầu bổ sung trên các phương thức HTTP. Tuy nhiên, đó không phải là trường hợp. Có các ràng buộc bổ sung nhưng chúng không thực sự ảnh hưởng đến hành vi của các phương thức HTTP. RFC2616 chắc chắn là hướng dẫn để làm theo.
Darrel Miller

4
Tôi đánh giá cao các liên kết. :) Nó làm tôi dừng lại và suy nghĩ về công cụ tôi đang sử dụng. Sau khi đọc bài viết của bạn và RFC, tôi thấy mình đề cập đến RFC trong phần còn lại của đêm. Nó giúp tôi nghĩ về quy trình như một quy trình HTTP trước và quy trình nghỉ ngơi thứ hai. Nhiều đánh giá cao.
Perry Tew

4
@PerryTew Bây giờ bạn có thể vào đây tools.ietf.org/wg/httpbis và xem phiên bản hiện đang được sửa đổi của thông số HTTP. Thưởng thức!
Darrel Miller

12
Có lẽ tôi chỉ cần ngủ nhiều hơn, nhưng dường như tôi không thể tìm thấy thông tin chính xác mà OP yêu cầu trong RFC. Cơ thể nên là gì cho một phản ứng POST hoặc DELETE?
Cam Jackson

9
Chà, rõ ràng như bùn. Có lẽ một số thông tin trong câu trả lời sẽ hữu ích. Đặc biệt, khi liên kết đó đã chết.
Doug Molineux

25

Nhìn chung, các quy ước là những người nghĩ như bạn đang phân phối các trang web.

Đối với PUT, tôi sẽ trả lại cùng một chế độ xem mà bạn nhận được nếu bạn thực hiện GET ngay sau đó; điều đó sẽ dẫn đến 200 (tất nhiên, giả sử kết xuất thành công tất nhiên). Đối với POST, tôi sẽ chuyển hướng đến tài nguyên đã tạo (giả sử bạn đang thực hiện thao tác tạo; nếu không, chỉ cần trả về kết quả); mã để tạo thành công là năm 201, đây thực sự là mã HTTP duy nhất cho chuyển hướng không nằm trong phạm vi 300.

Tôi chưa bao giờ hài lòng về những gì XÓA sẽ trả lại (mã của tôi hiện đang tạo HTTP 204 và phần thân trống trong trường hợp này).


1
PUTtrở lại yêu cầu các trang tiếp theo có vẻ như một thói quen xấu, vì làm mới trên trang kết quả sẽ gây ra các yêu cầu để thực hiện một lần nữa. Thay vào đó, với tôi, thật hợp lý khi thực hiện chuyển hướng, giả sử bạn đang xử lý các yêu cầu đồng bộ.
lobati

1
@lobati Tôi nghĩ điều quan trọng cần lưu ý là việc gửi nhiều yêu cầu PUT giống hệt nhau, nên có kết quả chính xác giống như chỉ gửi một trong những yêu cầu PUT giống nhau. Có lẽ vấn đề bạn nêu ra bây giờ ít quan trọng hơn được đưa ra ở trên?
Iain

3
@ Tôi không thực sự. Vấn đề là, nếu một cái gì đó cập nhật bản ghi sau đó, bạn sẽ không muốn nó gửi PUTyêu cầu khác khiến dữ liệu được hoàn nguyên. Ví dụ: nếu hai người đang tham khảo cùng một trang, một người thực hiện cập nhật, thì người kia thực hiện cập nhật, nếu người đầu tiên làm mới để xem kết quả, nó sẽ thực sự khiến mọi thứ được hoàn nguyên trước khi người thứ hai thực hiện những thay đổi của họ.
lobati

"Nghĩ như trang web" là hoàn hảo, do đó, việc xóa có thể phản hồi với một số hành động tiếp theo có thể xảy ra, điều này phụ thuộc vào "câu chuyện" xung quanh lý do tại sao bạn lại xóa tài nguyên. Điều này ít nhất có thể là một liên kết để đưa tác nhân trở lại một số vị trí bắt đầu hành động hợp lý hoặc thậm chí chuyển hướng đến một tài nguyên trạng thái cho thấy tác động của việc xóa (tổng số đơn đặt hàng) và chứa các liên kết tiếp theo.
Luke Puplett 17/07/19

3

Tạo một tài nguyên thường được ánh xạ tới POST và điều đó sẽ trả về vị trí của tài nguyên mới; ví dụ: trong Rails giàn giáo, CREATE sẽ chuyển hướng đến SHOW cho tài nguyên mới được tạo. Cách tiếp cận tương tự có thể có ý nghĩa đối với việc cập nhật (PUT), nhưng đó không phải là một quy ước; một bản cập nhật chỉ cần chỉ ra thành công. Một xóa có lẽ chỉ cần chỉ ra thành công là tốt; nếu bạn muốn chuyển hướng, trả về DANH SÁCH tài nguyên có lẽ có ý nghĩa nhất.

Thành công có thể được chỉ định bởi HTTP_OK, vâng.

Quy tắc khó và nhanh duy nhất trong những gì tôi đã nói ở trên là TẠO nên trả về vị trí của tài nguyên mới. Điều đó có vẻ như không có trí tuệ đối với tôi; nó có ý nghĩa hoàn hảo rằng khách hàng sẽ cần có thể truy cập vào mục mới.


2
Bạn đã thực sự trộn lẫn PUT và POST. POST được sử dụng để tạo, PUT được sử dụng để cập nhật (và tạo). Cũng đáng lưu ý rằng PUT nên bình thường trong khi POST thì không.
Stevie

Một lệnh idempotent sẽ hoạt động đúng, tuy nhiên nhiều lần bạn chạy nó. Vì vậy, bạn sẽ có thể thực hiện cùng một PUT nhiều lần để áp dụng cùng một "cập nhật" mà không có bất kỳ tác dụng phụ tiêu cực nào.
Jacob Mattison

1

Bởi RFC7231 không thành vấn đề và có thể trống

Cách chúng tôi thực hiện giải pháp dựa trên tiêu chuẩn json api trong dự án:

post / put: xuất các thuộc tính đối tượng như trong get (bộ lọc trường / quan hệ áp dụng như nhau)

xóa: dữ liệu chỉ chứa null (vì nó đại diện cho đối tượng bị thiếu)

trạng thái xóa tiêu chuẩn: 200


0

Tôi thích ứng dụng trả lời Alfonso Tienda từ mã trạng thái HTTP để cập nhật và xóa?

Dưới đây là một số lời khuyên:

XÓA BỎ

  • 200 (nếu bạn muốn gửi một số dữ liệu bổ sung trong Phản hồi) hoặc 204 (được khuyến nghị).

  • Thao tác 202 đã bị xóa chưa được cam kết.

  • Nếu không có gì để xóa, hãy sử dụng 204 hoặc 404 (Thao tác XÓA là không cần thiết, xóa một mục đã bị xóa là hoạt động thành công , vì vậy bạn có thể trả về 204 , nhưng sự thật là idempotent không nhất thiết phải có cùng một phản hồi)

Các lỗi khác:

  • 400 Yêu cầu Không hợp lệ (Cú pháp sai hoặc truy vấn xấu là lạ nhưng có thể).
  • 401 Lỗi xác thực trái phép
  • 403 Cấm : Lỗi ủy quyền hoặc ID ứng dụng không hợp lệ.
  • 405 Không được phép . Chắc chắn rồi.
  • 409 Xung đột tài nguyên có thể có thể có trong các hệ thống phức tạp.
  • 501 , 502 trong trường hợp có lỗi.

ĐẶT

Nếu bạn đang cập nhật một yếu tố của bộ sưu tập

  • 200/204 với các lý do tương tự như XÓA ở trên.
  • 202 nếu hoạt động chưa được cam kết.

Phần tử được tham chiếu không tồn tại:

  • PUT có thể là 201 (nếu bạn đã tạo phần tử vì đó là hành vi của bạn)

  • 404 Nếu bạn không muốn tạo các phần tử qua PUT.

  • 400 Yêu cầu Không hợp lệ (Cú pháp không đúng hoặc một truy vấn xấu phổ biến hơn trong trường hợp XÓA).

  • 401 trái phép

  • 403 Bị cấm : Lỗi xác thực hoặc ID ứng dụng không hợp lệ.

  • 405 Không được phép . Chắc chắn rồi.

  • 409 Xung đột tài nguyên có thể có thể xảy ra trong các hệ thống phức tạp, như trong XÓA.

  • 422 Thực thể không thể xử lý Nó giúp phân biệt giữa "Yêu cầu xấu" (ví dụ: XML / JSON không đúng định dạng) và các giá trị trường không hợp lệ

  • 501 , 502 trong trường hợp có lỗi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.