Mã trạng thái phản hồi thích hợp để POST khi không tìm thấy tài nguyên gốc?


10

Tôi đã có điểm cuối sau:

a/{id}/b

và muốn tạo một yêu cầu bgửi POSTđến nó. Nếu avới {id}không được tìm thấy, tôi nên trả lời với 404 NOT_FOUNDhoặc có thể với 409 CONFLICT?

Đó là để xử lý đơn giản a/{id}, mẹo là ở đây một nguồn con được sử dụng.


Câu trả lời:


15

404 NOT FOUNDcó vẻ như phản ứng thích hợp, bởi vì tài nguyên với ID này không tồn tại. Rất rõ ràng để hiểu và bạn đang mong đợi câu trả lời tương tự nếu a/{id}được gọi.

409 CONFLICTđối với tôi dường như không phải là sự lựa chọn tốt hơn, vì trong ví dụ của bạn, bạn sẽ trả về 409 khi không tìm thấy tài nguyên gốc :).

Nhưng hãy nhớ rằng điều quan trọng nhất là phải nhất quán trong API của bạn


Tôi đồng ý. Nếu bạn cố ghi vào một thư mục không tồn tại, đó có phải là lỗi xung đột hay lỗi thư mục không? Nó có vẻ trực quan hơn theo cách này với tôi.
Neil

Một "thư mục" bạn có nghĩa là một đường dẫn không tồn tại?
Dherik

Tôi có nghĩa là một thư mục, như trên hệ thống tập tin.
Neil

Bạn có thể chi tiết kịch bản? Bởi vì nó phụ thuộc. Nếu thư mục được mong đợi cho máy chủ và (vì bất kỳ lý do gì) không có thì tôi nghĩ đây là lỗi máy chủ (5xx) không phải là lỗi máy khách (4xx). Nếu giá trị thư mục này được máy khách chuyển đến tài nguyên (dưới dạng id), là 404. Nhưng nếu thư mục được truyền trong phần thân thì đây có thể là bất cứ điều gì khác (412, 422 ... một cái gì đó đại diện cho "xác thực thất bại: thư mục không không tồn tại"). Đó là một câu hỏi hay để hỏi và thảo luận.
Dherik

Nếu bạn yêu cầu máy chủ cung cấp tệp có đường dẫn /nonexistent/help.html và thư mục / nonexistent không tồn tại, chỉ có một câu trả lời rõ ràng cho việc này. Không tìm thấy tệp 404! Thậm chí có thể tồn tại /home/help.html và phản hồi sẽ không khác nhau. Đây là một ứng dụng REST rõ ràng, nhưng tôi thấy không có lý do tại sao logic sẽ thay đổi. Cha mẹ phải tồn tại đầu tiên.
Neil

4

Ngoài câu trả lời của @ Dherik.

URI là mã định danh , vì vậy chúng tôi phải ghi nhớ rằng ( /a/{id}/blà mã định danh). Các URI là vô nghĩa đối với cá nhân, và như vậy là cho khách hàng HTTP.

404 là câu trả lời đúng . Về bản chất, máy chủ đang trả lời

Tôi đã không tìm thấy bất kỳ tài nguyên với id như vậy. Tài nguyên không tìm thấy 1

Cho dù tài nguyên bị thiếu là cha mẹ hay con cái không quan trọng.

Chúng tôi, các nhà phát triển, xem phân cấp và đường dẫn trong URI, nhưng các máy khách HTTP thì không. Nói cách khác, HTTP chỉ có nghĩa là được giải thích bởi các máy khách HTTP chứ không phải bởi con người (nhà phát triển, người dùng cuối, v.v.).

Trong trường hợp nghi ngờ, đừng hỏi mã nào có ý nghĩa đối với bạn (con người). Hãy hỏi, mã nào có ý nghĩa đối với máy khách HTTP. Bạn muốn ứng dụng khách HTTP hoạt động như thế nào?

Tại sao? Bởi vì một số mã trạng thái làm cho các khách hàng này thực hiện các hoạt động nhất định. Ví dụ: 302 . Mã này thường làm cho các trình duyệt web chuyển hướng đến một vị trí cụ thể (URI) được thông báo trong các tiêu đề phản hồi.

Đây có thể không phải là trường hợp của bạn, nhưng điều quan trọng là phải nhận thức được. Cuối cùng, mã trạng thái HTTP được gửi đến các máy khách HTTP. Không cho các ứng dụng của chúng tôi. Không cho người.


1: 409 hiếm khi được thực hiện như lỗi điều hướng. Nó thường liên quan đến việc thực hiện các hoạt động từ xa (xóa, cập nhật, mới, v.v.). Nhưng URI nên tồn tại. Nếu không, 404 sẽ thắng thế

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.