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

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

мой вопрос: где рекомендуемое место для размещения причины/описания / причины ошибки? Имеет ли смысл для 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

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

4 ответов


цитирование из спецификации HTTP для 400.коды ошибок х:

класс 4xx кода состояния предназначен для случаев, в которых клиент похоже, ошибся. За исключением случаев ответа на запрос руководителя, серверу следует включить объект, содержащий объяснение ошибки ситуации, и является ли это временным или постоянным состоянием. Эти коды состояния применимы к любому методу запроса. Агенты пользователей должны дисплей любого объекта пользователь.

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


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


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

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

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

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

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

ссылка