Thông báo lỗi còn lại trong Tiêu đề HTTP hoặc Nội dung phản hồi?


82

Tôi có một dịch vụ REST tiếp xúc với các ứng dụng khách iPhone và Android. Hiện tại tôi làm theo các mã HTTP 200, 400, 401, 403, 404, 409, 500, v.v.

Câu hỏi của tôi là nơi được khuyến nghị đặt lý do / mô tả / nguyên nhân gây ra lỗi là ở đâu? Việc API REST luôn có Lý do tùy chỉnh trong tiêu đề như vậy có hợp lý hơn không?

< HTTP/1.1 400 Bad Request - Missing Required Parameters.
< Date: Thu, 20 Dec 2012 01:09:06 GMT
< Server: Apache/2.2.22 (Ubuntu)
< Connection: close
< Transfer-Encoding: chunked

Hay tốt hơn là có nó trong Cơ quan phản hồi thông qua JSON?

< HTTP/1.1 400 Bad Request
< Date: Thu, 20 Dec 2012 01:09:06 GMT
< Server: Apache/2.2.22 (Ubuntu)
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: application/json
{ "error" : "Missing Required Parameters" }

6
Ngày nay, một thực tế phổ biến là thêm tiêu đề tùy chỉnh, chẳng hạn như 'X-HTTP-Error-Description: Thiếu các thông số bắt buộc'.
andreszs

Câu trả lời:


94

Trích dẫn từ đặc tả HTTP cho mã lỗi 400.x:

Loại mã trạng thái 4xx dành cho các trường hợp khách hàng dường như đã mắc lỗi. Ngoại trừ khi phản hồi yêu cầu HEAD, máy chủ NÊN bao gồm một thực thể chứa giải thích về tình huống lỗi và đó là tình trạng tạm thời hay vĩnh viễn. Các mã trạng thái này có thể áp dụng cho bất kỳ phương thức yêu cầu nào. Tác nhân người dùng NÊN hiển thị bất kỳ thực thể nào được bao gồm cho người dùng.

Cách tốt nhất là bao gồm thông báo lỗi dưới dạng một thực thể trong phần nội dung của phản hồi HTTP - có thể là JSON, văn bản thuần túy, HTML được định dạng hoặc bất kỳ định dạng nào khác mà bạn có thể muốn sử dụng.


24

Tốt hơn là có các chi tiết lỗi trong cơ thể. Hơn nữa, nhiều (hầu hết / gần như tất cả, ví dụ: WSGI) máy chủ và máy khách không hỗ trợ thay đổi tên của mã lỗi - coi chúng như các cặp cố định (vì vậy, ví dụ: 400 luôn là "Yêu cầu sai" chứ không phải "Yêu cầu xấu - Bạn Quên xác định ID người dùng "). Ngay cả khi chúng không bị vỡ, chúng sẽ không quan tâm đến tên đặc biệt của bạn cho mã lỗi cụ thể.


3

Lỗi không thuộc về cơ thể. Nó nằm trong tiêu đề Cảnh báo.

Tiêu đề HTTP chung cảnh báo chứa thông tin về các sự cố có thể xảy ra với trạng thái của thư.

Tài liệu tham khảo


3
Sẽ rất tốt nếu sử dụng tiêu đề "chính thức" cho việc này. Tuy nhiên, Warningnhư tên cho thấy, không dành cho lỗi. RFC (7234) cho biết:> Việc sử dụng cảnh báo, thay vì mã trạng thái lỗi, phân biệt các phản hồi này với các lỗi thực sự.
Frans

1
Lưu ý: Tiêu đề Cảnh báo sắp không được dùng nữa; xem Cảnh báo ( github.com/httpwg/http-core/issues/139 ) và Cảnh báo: header & stale-while-revalidate ( github.com/whatwg/fetch/issues/913 ) để biết thêm chi tiết.
Bizmarck

-5

Tôi luôn làm cả hai. Tôi thường đặt thông báo trạng thái thành thứ gì đó mà giao diện người dùng có thể hiển thị theo cách thân thiện với người dùng, chẳng hạn như "409 - Không thể thêm người dùng mới, họ đã tồn tại."

Sau đó, tôi bao gồm các chi tiết về các điều kiện lỗi trong phần thân dưới dạng JSON để các nhà phát triển giao diện người dùng có thể cố gắng đưa ra các lựa chọn thông minh về việc cần làm.

{
  "status": 409,
  "message": "The user <username> was already added on <when> by <who> and given the user id 12345.",
  "errors": {
    "id": 12345
  }
}

10
Tôi đã thấy điều này trước đây, đặt mã trạng thái HTTP vào nội dung phản hồi, nhưng tôi không thể hiểu tại sao mọi người lại nghĩ rằng điều này thậm chí ổn chứ đừng nói là tốt. Bất kỳ ứng dụng khách nào nhận được lỗi này đều có thể sử dụng các tiêu đề phản hồi đã bao gồm mã này, vì vậy việc bổ sung vào phần nội dung là không cần thiết và tiềm ẩn khả năng thông tin không nhất quán. Tại sao?
TheHerk

Nhiều trường hợp sử dụng, nhưng về cơ bản hãy nghĩ về hai mã được xử lý trong các phần khác nhau của ứng dụng. mã trạng thái http trong tiêu đề được lớp truyền thông bắt và có khả năng xử lý. Ở cấp ứng dụng, 409 hoặc 422 có thể được xử lý theo cách khác nhau để định hướng người dùng đến hướng hành động phù hợp. (lớp được sử dụng khoảng đây để giải thích các lớp trong một SPA ví dụ)
Matthew Purdon
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.