2011-01-24 8 views
58

The HTTP/1.1 specification (RFC 2616) имеет следующий сказать о значении status code 400, Bad Request (§10.4.1):HTTP 400 (плохой запрос) для логической ошибки, не уродлив синтаксис запроса

Запрос не может быть понят сервера из-за некорректный синтаксис , Клиент НЕ ДОЛЖЕН повторять запрос без изменений.

Там, как представляется, является общей практикой среди нескольких HTTP на основе API, в эти дни, чтобы использовать 400 для обозначения логического, а не ошибку в синтаксис с запросом. Я предполагаю, что API делают это, чтобы различать 400 (клиентский) и 500 (с помощью сервера). Допустимо или неверно использовать 400 для обозначения несинтаксических ошибок? Если это приемлемо, есть ли аннотированная ссылка на RFC 2616, которая обеспечивает более глубокое понимание предполагаемого использования 400?

Примеры:

+0

Почему веб-сервер должен заботиться о синтаксических ошибках? – leppie

+0

@leppie: веб-серверу необходимо убедиться, например, что строка запроса и заголовки хорошо сформированы. –

+0

Но это был бы неверный запрос клиента. – leppie

ответ

56

Статус 422 (RFC 4918, Section 11.2) приходит на ум:

422 (Unprocessable Entity) код состояния означает, что сервер понимает тип содержимого объекта запроса (отсюда в 415 (Unsupported Media Type) статус код неуместен), а синтаксис объекта запроса верен (при этом код статуса 400 (неудачный запрос) является неуместным), но не смог обработать содержащиеся инструкции.Например, это условие ошибки может возникнуть, если тело запроса XML содержит правильно сформированные (т. Е. Синтаксически правильные), но семантически ошибочные инструкции XML.

+1

RFC 4918 - это WebDAV RFC, с которым я не знаком. Можно ли повторно использовать [расширения кода состояния для HTTP/1.1] (http://greenbytes.de/tech/webdav/rfc4918.html#status.code.extensions.to.http11) в службах HTTP, отличных от WebDAV ? Секция [HTTP-совместимость клиента] (http://greenbytes.de/tech/webdav/rfc4918.html#rfc.section.B) показала бы, что это так. Поддерживает ли IETF окончательный список всех (основных и внутренних) HTTP-кодов, чтобы гарантировать, что какая-либо другая служба, которая строит на HTTP, не вводит еще больше кодов, которые конфликтуют с другими расширениями? – Day

+3

Да, все в порядке. Вот почему есть реестр кода состояния. См. Http://www.iana.org/assignments/http-status-codes. –

+5

422 подходит очень близко. Единственный стыд заключается в том, что он, похоже, специально связан с непроцессорным объектом, а не с необработанным запросом. Если бы он охватывал только последний, он также охватывал бы случай HTTP GET, поскольку он не имеет сущности. Однако в описании 422 четко указано, что 400 не подходит для логически недействительного запроса. –

1

Можно утверждать, что наличие неверных данных в запросе является ошибка синтаксиса, даже если ваш фактический запрос на уровне HTTP (строка запроса, заголовки и т. д.) является синтаксически действительным.

Например, если веб-служба Restful документирована как принимающая POST с настраиваемым типом содержимого контента XML application/vnd.example.com.widget+xml, и вместо этого вы отправляете простой текст или бинарный файл, кажется, что он считает, что это синтаксическая ошибка - ваш орган запроса не находится в ожидаемой форме.

Я не знаю каких-либо официальных ссылок на спине это, хотя, как обычно, это, кажется, вплоть до интерпретации RFC 2616.

Update: Примечание пересмотренная формулировка RFC 7231 §6.5.1:

Код статуса 400 (Bad Request) указывает, что сервер не может или не будет обрабатывать запрос из-за того, что воспринимается как ошибка клиента, например, искаженный синтаксис запроса, неправильное формирование сообщений запроса или маршрутизация ложных запросов).

, кажется, поддерживает этот аргумент больше, чем теперь устарел RFC 2616 §10.4.1, который сказал просто:

Запрос не может быть понят сервером из-за некорректного синтаксиса. Клиент НЕ ДОЛЖЕН повторять запрос без изменений.

+4

Это, безусловно, интересный способ взглянуть на него. Что относительно запросов GET, где используется значение параметра недопустимой строки запроса? Не могли бы вы сказать, что 400 можно использовать, потому что, хотя строка запроса хорошо сформирована, значение параметра строки запроса имеет синтаксическую ошибку в представлении приложения? –

+0

Ну, кажется, это небольшой шаг от примера POST, который я дал, но я признаю, что это похоже на то, что нужно делать то же самое с запросами GET, когда приложение находит части URL-адреса недопустимыми. В интерфейсе ** действительно ** Restful с использованием HATEOAS (Hyptertext как механизм состояния приложения) URL-адреса ресурсов не важны для клиента, чтобы знать - клиенты просто следуют ссылкам из других ресурсов. Но тогда большинство API-интерфейсов REST не придерживаются этого принципала и вместо этого объясняют, какие параметры строки запроса должны быть добавлены к URL-адресу, поэтому я предполагаю, что в таких службах ответ 400 будет одобрен. – Day

2

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

Просто мои 2 цента ... Нам нужны юристам & судей интерпретировать язык в RFC эти дни :)

Спасибо, Vish

6

HTTPbis выступит фразировку 400 Bad Request так что он также охватывает логические ошибки. Таким образом, 400 будет включать в себя 422.

От https://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-18#section-7.4.1
«Сервер не может или не будет обрабатывать запрос, из-за ошибки клиента (например, ошибки в синтаксисе)»

13

В это время, последний проект HTTPbis спецификация, которая предназначена для замены и сделать RFC 2616 устаревшим, states:

The (Bad Request) код состояния 400 указывает на то, что сервер не может или не будет обрабатывать запрос, потому что принятый синтаксис является недопустимым, бессмысленно или превышает некоторые ограничения на то, что сервер желает для обработки.

Это определение, в то время, конечно, по-прежнему подвержены изменениям, ратифицирует широко используется практика реагирования на логические ошибки с 400.

1

На серверах Java EE 400 возвращается, если ваш URL ссылается на не -устойчивое «веб-приложение». Это синтаксическая ошибка? Зависит от того, что вы подразумеваете под синтаксической ошибкой. Я бы сказал, да.

В правилах синтаксиса на английском языке предписываются определенные отношения между частями речи. Например, «Боб женится на Мэри» синтаксически корректен, потому что он следует шаблону {Noun + Verb + Noun}. В то время как «Боб брака Мэри» будет синтаксически неправильным, {Noun + Noun + Существительное}.

Синтаксис простого URL-адреса {протокол +: + // + сервер +: + порт}. В соответствии с этим «http://www.google.com:80» синтаксически корректен.

А как насчет "abc: //www.google.com: 80"? Кажется, что он соответствует той же схеме. Но действительно это синтаксическая ошибка. Зачем? Поскольку «abc» не является протоколом DEFINED.

Дело в том, что для определения того, нужна ли нам ситуация 400, требуется больше, чем синтаксический анализ символов, пробелов и разделителей. Он также должен признать, какие действительные «части речи».