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

84

У меня есть служба 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

Или лучше иметь его в теле ответа через 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
В настоящее время обычной практикой является добавление пользовательских заголовков, таких как «X-HTTP-Error-Description: Отсутствуют обязательные параметры».
andreszs

Ответы:

96

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

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

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

Восприятие
источник
24

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

Тадек
источник
3

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

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

Справка

B Семь
источник
3
Было бы неплохо использовать для этого «официальный» заголовок. Однако, Warningкак следует из названия, это не для ошибок. RFC (7234) гласит:> Использование предупреждения, а не кода состояния ошибки, отличает эти ответы от истинных сбоев.
Frans
1
Примечание. Заголовок «Предупреждение» скоро станет устаревшим; см. Предупреждение ( github.com/httpwg/http-core/issues/139 ) и Предупреждение: header & stale-while-revalidate ( github.com/whatwg/fetch/issues/913 ) для получения дополнительных сведений.
Bizmarck