2012-10-22 34 views
14

Giả sử rằng tôi có tài nguyên (ví dụ: /api/shipments/100) hỗ trợ phương thức HTTP DELETE. Như bạn có thể hiểu từ chính URI, nếu yêu cầu DELETE được thực hiện đối với URI này, tài nguyên này sẽ bị xóa.Mã trạng thái HTTP nào cần trả lại khi thao tác DELETE không được phép vì lý do cụ thể

Trong tình huống hiện tại của tôi, yêu cầu DELETE chỉ có thể được thực hiện thành công nếu một điều kiện nhất định được đáp ứng như sau:

  • Nếu tình trạng lô hàng không được thiết lập để InTransit hoặc Delivered.

Nếu có yêu cầu DELETE đối với URI đó và điều kiện trên không được đáp ứng, mã trạng thái HTTP nào sẽ thích hợp hơn để trả lại trong trường hợp đó? Tôi đã nghĩ về những người dưới đây, nhưng không thể quyết định cái nào là ngữ nghĩa hơn:

  • 405 Phương pháp không được phép
  • 403 Forbidden
  • 409 Xung đột

Trả lời

15

tôi sẽ đi với 409: Conflict, bởi vì những gì bạn có là vi phạm trạng thái tài nguyên.

405: Method Not Allowed cũng sẽ hoạt động. Nếu bạn muốn sử dụng một số 405, bạn phải gửi tiêu đề Allow để chỉ ra các phương thức được hỗ trợ và các phương thức được hỗ trợ sẽ thay đổi phụ thuộc vào trạng thái của tài nguyên. Theo tôi, mã phản hồi này phù hợp với tài nguyên chỉ đọc, tài nguyên không thể xóa được nhưng các nhận xét của Darrel cho bài đăng này là hợp lệ. Thông số kỹ thuật không rõ ràng:

Phương pháp được chỉ định trong Dòng yêu cầu không được phép đối với tài nguyên được xác định bởi yêu cầu-URI. Câu trả lời PHẢI bao gồm tiêu đề Cho phép chứa danh sách các phương thức hợp lệ cho tài nguyên được yêu cầu .

Trong cả hai trường hợp, bạn nên cung cấp thông tin trong nội dung phản hồi để khách hàng hiểu nguồn gốc của lỗi.


Về hai phương pháp khác được đề cập:

403: Forbidden nên được sử dụng khi bạn không có đặc quyền thích hợp để thay đổi tài nguyên, tức là nếu bạn cần phải là một admin để xóa tài nguyên đó và bạn không.

412: Precondition Failed chủ yếu được sử dụng cho các yêu cầu có điều kiện trong đó các điều kiện tiên quyết được chỉ định rõ ràng trong tiêu đề yêu cầu. Ví dụ, bạn có thể có các yêu cầu PUT có điều kiện chỉ nên thực hiện khi tiêu đề If-Match hợp lệ. Nếu bạn không chỉ định bất cứ điều gì trong tiêu đề yêu cầu, tôi vẫn muốn chọn 409 trên 412. Dưới đây là spec cho 412:

Điều kiện tiên quyết được đưa ra trong một hoặc nhiều trường yêu cầu-header đánh giá false khi nó được kiểm tra trên máy chủ.Mã phản hồi này cho phép khách hàng đặt điều kiện tiên quyết vào tài nguyên hiện tại metainformation (dữ liệu trường đầu trang) và do đó ngăn chặn được yêu cầu phương pháp không được áp dụng cho tài nguyên khác ngoài dự định.

+0

Bạn có một tài liệu tham khảo cho lập luận của bạn chống lại 405? Làm thế nào bạn có thể nói rằng một nguồn lực sẽ không bao giờ hỗ trợ một phương pháp cụ thể? Tôi không thấy vấn đề với các phương thức được hỗ trợ thay đổi theo thời gian. –

+0

Vui lòng xem chỉnh sửa của tôi. –

+0

Ngoài ra, nếu bạn nhìn vào định nghĩa của tiêu đề Allow, nó bao gồm chú thích 'Tập thực tế của các phương thức được cho phép được định nghĩa bởi máy chủ gốc tại thời điểm mỗi yêu cầu'. Điều này cho tôi biết rằng tập hợp các phương thức" được phép " dự kiến ​​sẽ thay đổi và 405 phản ánh trạng thái hiện tại. http://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-18#section-9.1 –

1

Tôi sẽ sử dụng 412: Điều kiện tiên quyết không thành công.

Vui lòng xem cho HTTP mã trạng thái

Web Status Codes

+0

Nhưng nó nói "Điều kiện tiên quyết được đưa ra trong một hoặc nhiều trường ** tiêu đề yêu cầu ** được đánh giá là sai khi nó được kiểm tra trên máy chủ" sẽ không có ý nghĩa trong quan điểm của tôi. – tugberk

+0

Tôi đồng ý, vui lòng xem cập nhật của tôi. –

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