Какой код статуса HTTP использовать для обязательных параметров не предоставлен? - PullRequest
54 голосов
/ 26 февраля 2012

У меня есть несколько страниц, предназначенных для вызова с помощью AJAX - мне нужно, чтобы они возвращали неправильный код состояния, если они не могут быть отображены, и мой javascript отобразит окно с ошибкой соответственно.

Например, еслипользователь не прошел проверку подлинности или время его сеанса истекло, и он пытается вызвать одну из страниц AJAX, он вернет 401 Unathorized.

У меня также есть некоторое возвращение 500 Internal Server Error, если что-то действительно странное происходит на сервере.side.

Какой код статуса я должен вернуть, если одна из этих страниц была вызвана без обязательных параметров?(и, следовательно, не может вернуть содержимое).

Я посмотрел статью в Википедии о HTTP-кодах состояния , но самую близкую я мог найти к коду, который искалдля это было:

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

Редактировать: приведенный выше код является специфичным для WebDAV и поэтому вряд ли будет уместным в этом случае

Может кто-нибудь придумать подходящий код для возврата?

Ответы [ 5 ]

40 голосов
/ 26 февраля 2012

Какой код статуса я должен вернуть, если одна из этих страниц была вызвана без обязательных параметров? (и, следовательно, не может вернуть любой контент).

Вы можете выбрать 404 Not Found:

Сервер не нашел ничего, соответствующего Request-URI [при условии, что ваши обязательные параметры являются частью URI, т.е. $_GET] . Не указано, является ли состояние временным или постоянным. Код состояния 410 (Унесенные) СЛЕДУЕТ использовать, если сервер через некоторый внутренне конфигурируемый механизм знает, что старый ресурс постоянно недоступен и не имеет адреса пересылки. Этот код состояния обычно используется, когда сервер не хочет точно указывать, почему запрос был отклонен или когда другой ответ не применим.

(выделите мной)

404 Not Found - это подмножество 400 Bad Request, которое также может быть взято, потому что очень ясно, что это такое:

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

Я не могу предложить, чтобы вы выбрали код ответа WEBDAV, который не существует для клиентов HTTP, использующих гипертекст, но вы можете, это совершенно верно, вы серверный кодер, вы можете фактически взять любой код состояния HTTP-резонанса Вы считаете подходящим для своего HTTP-клиента, дизайнером которого вы также являетесь:

11,2. 422 необработанных объекта

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

Объект запроса IIRC является телом запроса. Поэтому, если вы работаете с телами запросов, это может быть уместно, как писал Джулиан.


Вы прокомментировали:

ИМХО, текст для 400 говорит о неправильном синтаксисе. Я предполагаю, что синтаксис здесь относится к синтаксису строки HTTP, которую клиент отправляет на сервер.

Это может быть, но это может быть что-нибудь синтаксически выраженное, весь запрос, только некоторые заголовки запроса, или определенный заголовок запроса, URI запроса и т. Д. общий ответ на ошибку клиента:

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

Важной частью здесь является то, что вы должны сказать клиенту, что пошло не так. Код состояния просто говорит о том, что что-то пошло не так (в классе 4xx), но HTTP не был специально разработан для того, чтобы сделать отсутствующий параметр части query-info заметным как условие ошибки. Фактически, URI знает только то, что есть часть информации запроса, а не то, что она означает.

Если вы думаете, что 400 слишком широк, я предлагаю вам выбрать 404, если проблема связана с URI, например, $_GET переменные.

9 голосов
/ 26 февраля 2012

Я не знаю о намерениях авторов RFC, но код состояния, который я видел, использовался для этого случая в дикой природе: 400 Bad Request .

7 голосов
/ 27 февраля 2012

422 - обычный код состояния HTTP; используется вне WebDAV. Вопреки тому, что говорят другие, с этим нет проблем; HTTP имеет реестр кодов состояния по причине.

См. http://www.iana.org/assignments/http-status-codes

1 голос
/ 26 февраля 2012

Описание, как указано против 400

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

(Акцент мой)

Это говорит о неверно сформированном синтаксисе, что не относится к случаю, когда браузер отправляет запрос на сервер. Это как раз тот случай, когда пропущены параметры (пока нет искаженного синтаксиса).

Я бы предложил придерживаться 404:)

(Эксперты меня поправляют, если я где-то ошибаюсь :))

0 голосов
/ 26 февраля 2012

Внимательно прочитайте:

https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

422 - это вещь, специфичная для WebDAV, и я не видел, чтобы она использовалась ни для чего другого.

400, хотя и не предназначен для этой конкретной цели, похоже, является распространенным выбором.

404 также является приемлемым выбором, если ваш API является RESTful или похожим (используя часть пути URI для указания параметров поиска)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...