Подтвердить что ты не робот

Сообщение об ошибке в заголовке HTTP или блоке ответа?

У меня есть служба REST, которая предоставляется клиентам iPhone и Android. В настоящее время я следую HTTP-кодам 200, 400, 401, 403, 404, 409, 500 и т.д.

Мой вопрос: где рекомендуется указать причину/описание/причину ошибки? Имеет ли смысл, чтобы REST API всегда имел пользовательский разум в заголовке, как это?

< 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

Или лучше иметь его в Body Response через 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" }
4b9b3361

Ответ 1

Цитата из спецификации HTTP для кодов ошибок 400.x:

Класс кода 4xx статуса предназначен для случаев, когда клиент похоже, ошибался. За исключением случаев ответа на запрос HEAD, сервер ДОЛЖЕН включать объект, содержащий объяснение ошибки ситуации, и является ли это временным или постоянным условием. Эти коды статуса применимы к любому методу запроса. Пользовательские агенты ДОЛЖНЫ отображение любого включенного объекта пользователю.

Лучше всего включить сообщение об ошибке как сущность в тело ответа HTTP - будь то JSON, обычный текст, форматированный HTML или любой другой формат, который вы можете использовать.

Ответ 2

Лучше иметь детали ошибки в теле. Кроме того, многие (большинство/почти все, например WSGI) серверы и клиенты не поддерживают изменение имени кода ошибки - рассматривают их как фиксированные пары (так, например, 400 всегда "плохой запрос", а не "плохой запрос" - вы Забыл указать идентификатор пользователя "). Даже если они не сломаются, они не будут заботиться о вашем специальном имени для конкретного кода ошибки.

Ответ 3

Ошибка не относится к телу. Он принадлежит в заголовке предупреждения.

Общий HTTP-заголовок Warning содержит информацию о возможных проблемах со статусом сообщения.

Ссылка

Ответ 4

Я всегда делаю то и другое. Обычно я устанавливаю сообщение статуса на то, что внешний интерфейс может показать дружественным образом пользователю, например, "409 - Не удалось добавить нового пользователя, они уже существуют".

Затем я включаю детали условий ошибки в теле как JSON, чтобы разработчики пользовательского интерфейса могли попытаться сделать разумный выбор о том, что делать.

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

Ответ 5

Если я попытался таким образом отправить ответ в веб-интерфейс, они не могут прочитать код состояния, и появляется ошибка. Но в разделе сети показан 409 ответ.

  res.status(409).json({
            status: 409,
            err_message: " already present"
          })