Mã trạng thái HTTP thích hợp nhất cho trang lỗi "không tìm thấy mục" là gì


117

Tôi tò mò không biết mã trạng thái HTTP thích hợp nhất cho trang "mặt hàng không tồn tại" là gì.

Nếu bản thân trang không tồn tại, tôi rõ ràng sẽ sử dụng 404. Tuy nhiên, một trong các trang của tôi có useridđối số (đó là trang "chỉnh sửa người dùng") và trong trường hợp không có người dùng nào có ID người dùng đã cho, tôi đang hiển thị trang lỗi, nhưng tôi cũng muốn gửi tiêu đề trạng thái 4xx (vì "200 OK" không thực sự phù hợp).

Tôi đoán 404 sẽ ổn vì nó "không tìm thấy" chứ không phải "không tìm thấy tệp", nhưng tôi tự hỏi liệu có mã nào tốt hơn cho trường hợp này không.

Câu trả lời:


139

Tìm hiểu kỹ lưỡng các mã lỗi HTTP khó hiểu là một ý tưởng tồi. Các trình duyệt đôi khi phản ứng theo những cách không hữu ích làm rối loạn tình hình. Gắn bó với 404.


14
Chết tiệt bạn đã cho lời khuyên tốt :( Các OCD để không 404 tất cả những điều là mặc dù thực sự.
Carrie Kendall

16
Lỗi 404 hơi mơ hồ để phân biệt URI xấu với thực thể không được tìm thấy. Cần có mã tiêu chuẩn mới để phân biệt 404s.
Breakskater vào

2
Tôi muốn trả lại 204 nội dung trống hơn là trả lại mã trạng thái
ambigus

46

Mã trả về 404 thực sự có nghĩa là 'không tìm thấy tài nguyên' và áp dụng cho bất kỳ thực thể nào mà yêu cầu được thực hiện nhưng không được đáp ứng. Vì vậy, nó hoạt động hiệu quả như nhau đối với các trang, tiểu mục của trang và bất kỳ mục nào tồn tại trên trang có yêu cầu cụ thể được hiển thị.

Vì vậy, 404 là mã phù hợp để sử dụng trong trường hợp này. Lưu ý rằng nó không áp dụng cho 'máy chủ không tìm thấy', là một tình huống khác trong đó yêu cầu được đưa ra nhưng hoàn toàn không được trả lời, trái ngược với được trả lời nhưng không có tài nguyên được yêu cầu.


1
Điều gì sẽ xảy ra nếu tôi muốn cập nhật đối tượng foo với id = 1 và không có foo nào trong cơ sở dữ liệu với id này?
valijon

1
Trong trường hợp này, bạn có một vấn đề đồng thời cần khắc phục: nếu bạn truy xuất một đối tượng có id = 1 và nó không còn tồn tại khi bạn cố gắng cập nhật nó, một số luồng hoặc quy trình khác đã bỏ qua khóa của bạn (hoặc bạn không đặt một) và đã xóa nó. Điều đó không tốt. Ngoài ra, nếu bạn đang cố cập nhật đối tượng id = n (trong đó n được cung cấp cho bạn) mà không kiểm tra trước nó có tồn tại hay không, thì bạn đang thiếu bước xác thực trong logic cập nhật của mình, điều này cũng không tốt.
Eight-Bit Guru


8

Điều đó tùy thuộc nếu userid là định danh tài nguyên hay tham số bổ sung. Nếu đúng thì bạn có thể trả về 404 nếu không, bạn có thể trả lại mã khác như

400 (bad request) ‐ indicates a bad request
hoặc là
412 (Precondition Failed) e.g. conflict by performing conditional update

Thông tin thêm trong cuốn sách InfoQ Explores: REST miễn phí .


1
Bằng cách nói "tham số bổ sung", bạn có nghĩa là trường tiêu đề yêu cầu? Nếu không, tôi không khuyên bạn nên sử dụng 412. "Mã trạng thái 412 (Điều kiện tiên quyết không thành công) chỉ ra rằng một hoặc nhiều điều kiện được đưa ra trong các trường tiêu đề yêu cầu được đánh giá là sai khi được kiểm tra trên máy chủ."
oferei
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.