Осталось сообщение об ошибке в заголовке 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

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

person James Cowhen    schedule 20.12.2012    source источник
comment
В настоящее время обычной практикой является добавление пользовательских заголовков, таких как «X-HTTP-Error-Description: Отсутствуют обязательные параметры».   -  person andreszs    schedule 23.04.2017


Ответы (3)


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

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

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

person Perception    schedule 20.12.2012

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

person Tadeck    schedule 20.12.2012

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

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

Справочник

person B Seven    schedule 20.08.2018
comment
Было бы неплохо использовать для этого официальный заголовок. Однако Warning, как следует из названия, не предназначен для ошибок. В RFC (7234) говорится: ›Использование предупреждения, а не кода состояния ошибки, отличает эти ответы от истинных сбоев. - person Frans; 17.01.2019
comment
Примечание. Заголовок «Предупреждение» скоро станет нерекомендуемым; см. Предупреждение (https://github.com/httpwg/http-core/issues/139 ) и Предупреждение: заголовок и устаревшие при повторной проверке (github.com/whatwg/fetch/issues/ 913) для получения более подробной информации. - person Bizmarck; 11.03.2020