200
Ugh ... (309, 400, 403, 409, 415, 422) ... rất nhiều câu trả lời cố gắng đoán, tranh luận và chuẩn hóa đâu là mã trả lại tốt nhất cho yêu cầu HTTP thành công nhưng cuộc gọi REST thất bại .
Việc trộn mã trạng thái HTTP và mã trạng thái REST là sai .
Tuy nhiên, tôi đã thấy nhiều triển khai trộn lẫn chúng và nhiều nhà phát triển có thể không đồng ý với tôi.
Mã trả về HTTP có liên quan đến HTTP Request
chính nó. Một cuộc gọi REST được thực hiện bằng cách sử dụng yêu cầu Giao thức truyền siêu văn bản và nó hoạt động ở mức thấp hơn so với chính phương thức REST được gọi. REST là một khái niệm / cách tiếp cận và đầu ra của nó là kết quả kinh doanh / logic , trong khi mã kết quả HTTP là một phương tiện giao thông .
Ví dụ: trả về "404 Không tìm thấy" khi bạn gọi / người dùng / bị nhầm lẫn, bởi vì điều đó có thể có nghĩa là:
- URI sai (HTTP)
- Không tìm thấy người dùng (REST)
"403 Bị cấm / Truy cập bị từ chối" có thể có nghĩa là:
- Cần có sự cho phép đặc biệt Trình duyệt có thể xử lý nó bằng cách hỏi người dùng / mật khẩu. (HTTP)
- Quyền truy cập sai được cấu hình trên máy chủ. (HTTP)
- Bạn cần được xác thực (REST)
Và danh sách có thể tiếp tục với '500 Lỗi máy chủ "(lỗi ném HTTP / Nginx HTTP hoặc lỗi ràng buộc kinh doanh trong REST) hoặc các lỗi HTTP khác, v.v ...
Từ mã, thật khó để hiểu lý do thất bại là gì, lỗi HTTP (vận chuyển) hay lỗi REST (logic).
Nếu yêu cầu HTTP được thực hiện thành công, nó sẽ luôn trả về 200 mã, bất kể (các) bản ghi có được tìm thấy hay không. Bởi vì tài nguyên URI được tìm thấy và được xử lý bởi máy chủ HTTP. Vâng, nó có thể trả về một bộ trống. Có thể nhận được một trang web trống với kết quả 200 như HTTP không?
Thay vì điều này, bạn có thể trả về 200 mã HTTP với một số tùy chọn:
- Đối tượng "lỗi" trong kết quả JSON nếu có lỗi xảy ra
- Mảng / đối tượng JSON trống nếu không tìm thấy bản ghi
- Cờ kết quả / thành công bool kết hợp với các tùy chọn trước đó để xử lý tốt hơn.
Ngoài ra, một số nhà cung cấp internet có thể chặn yêu cầu của bạn và trả lại cho bạn mã HTTP 404. Điều này không có nghĩa là dữ liệu của bạn không được tìm thấy, nhưng có gì đó không đúng ở cấp độ vận chuyển.
Từ Wiki :
Vào tháng 7 năm 2004, nhà cung cấp dịch vụ viễn thông BT Group của Anh đã triển khai hệ thống chặn nội dung Cleanfeed, trả về lỗi 404 cho bất kỳ yêu cầu nào về nội dung được xác định là có thể bất hợp pháp bởi Internet Watch Foundation. Các ISP khác trả về lỗi "cấm" HTTP 403 trong cùng trường hợp. Việc sử dụng các lỗi 404 giả như một phương tiện để che giấu kiểm duyệt cũng đã được báo cáo ở Thái Lan và Tunisia. Ở Tunisia, nơi kiểm duyệt nghiêm trọng trước cuộc cách mạng năm 2011, mọi người đã nhận thức được bản chất của lỗi 404 giả và tạo ra một nhân vật tưởng tượng có tên "Ammar 404" đại diện cho "người kiểm duyệt vô hình".
Tại sao không chỉ đơn giản là trả lời với một cái gì đó như thế này?
{
"result": false,
"error": {"code": 102, "message": "Validation failed: Wrong NAME."}
}
Google luôn trả lại 200 dưới dạng mã trạng thái trong API mã hóa địa lý của họ, ngay cả khi yêu cầu không thành công về mặt logic: https://developers.google.com/maps/documentation/geocoding/intro#StatusCodes
Facebook luôn trả lại 200 cho các yêu cầu HTTP thành công, ngay cả khi yêu cầu REST không thành công: https://developers.facebook.com/docs/graph-api/USE-graph-api/error-handling
Thật đơn giản, mã trạng thái HTTP dành cho các yêu cầu HTTP. API REST là của bạn, xác định mã trạng thái của bạn.