2012-02-26 4 views
46

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

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

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

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

Я посмотрел на wikipedia article on HTTP status codes, но ближе всего один я мог бы найти в коде, я ищу был такой:

422 Unprocessable Entity
The request was well-formed but was unable to be followed due to semantic errors.

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

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

+1

См также (если это не является дубликатом даже): [HTTP код состояния для плохих данных] (http://stackoverflow.com/questions/1364527/http-status-code-for- bad-data) – hakre

+1

422 вполне уместно. –

+0

@JulianReschke Я думаю, что 4918 мог бы сделать с некоторыми ошибками, во-первых, чтобы указать, что он обновляет 2616, а во-вторых, чтобы уточнить, что новые коды статуса HTTP не все специфичны для WebDAV. – Alnitak

ответ

32

What status code should I return if one of these pages was called without required parameters? (and therefore can't return any content).

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

The server has not found anything matching the Request-URI [assuming your required parameters are part of the URI, i.e. $_GET ]. No indication is given of whether the condition is temporary or permanent. The 410 (Gone) status code SHOULD be used if the server knows, through some internally configurable mechanism, that an old resource is permanently unavailable and has no forwarding address. This status code is commonly used when the server does not wish to reveal exactly why the request has been refused, or when no other response is applicable.

(изюминка мной)

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

The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications.

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

11.2. 422 Unprocessable Entity

The 422 (Unprocessable Entity) status code means the server understands the content type of the request entity (hence a 415(Unsupported Media Type) status code is inappropriate), and the syntax of the request entity is correct (thus a 400 (Bad Request) status code is inappropriate) but was unable to process the contained instructions. For example, this error condition may occur if an XML request body contains well-formed (i.e., syntactically correct), but semantically erroneous, XML instructions.

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


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

IMHO, the text for 400 speaks of malformed syntax. I would assume the syntax here relates to the syntax of HTTP string that the client sends across to the server.

Это может быть, но это может быть что угодно, синтаксически выражаются, весь запрос, только некоторые заголовки запроса, или конкретный заголовок запроса, запрос URI и т.д .. 400 не конкретно о «HTTP строки синтаксиса», это Infact общий ответ на ошибку клиента:

The 4xx class of status code is intended for cases in which the client seems to have erred. Except when responding to a HEAD request, the server SHOULD include an entity containing an explanation of the error situation, and whether it is a temporary or permanent condition. These status codes are applicable to any request method. User agents SHOULD display any included entity to the user.

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

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

+0

IMHO, текст для 400 говорит о некорректном * синтаксисе *. Я бы предположил, что синтаксис здесь относится к синтаксису строки HTTP, которую клиент отправляет на сервер. В случае отсутствия параметров синтаксис по-прежнему будет правильным, что заставляет меня считать, что 400 - плохой выбор. Исправьте меня, если я где-то не прав :) – SuperSaiyan

+0

@Thrustmaster: Ты не ошибаешься, но немного узкомыслен. Только потому, что это может быть, это не значит, что это не может означать другого. Особенно для x00-кодов, что верно. Добавлена ​​дополнительная информация. – hakre

+0

Я мог бы быть немного узкомысленным, хе-хе. Я до сих пор не уверен . Наверное, я буду читать RFC целиком, прежде чем комментировать все дальше. Спасибо за ответ, upvoted :) – SuperSaiyan

8

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

+0

400, ИМО, плохой выбор. Проверьте мой комментарий ниже ответа hakre. Скажите мне, если я ошибаюсь :) – SuperSaiyan

+3

Вы ошибаетесь только в том, чтобы не делать лучшего предложения. :) – AndreKR

+0

Я (возможно, не там в комментарии), 404 :) – SuperSaiyan

0

Прочитайте это внимательно:

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

422 является WebDAV-определенная вещь, и я не видел раньше ничего другого.

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

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

+0

спасибо - теперь обновляется вопрос –

+2

422 есть * не * WebDAV-специфический, и он * есть * используется в других контекстах. –

1

Описание цит против 400

The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications.

(курсив мой)

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

Я хотел бы предложить палку с 404 :)

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

+3

См. Http://trac.tools.ietf.org/wg/httpbis/trac/ticket/303; пересмотр RFC 2616 пояснит, что «искаженный синтаксис» является лишь одной из многих потенциальных причин. –

6

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

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

+0

Уверен, что вы можете использовать и 478, это ваш выбор, вы не привязаны к какому-либо RFC. Однако я бы не предложил повторно использовать специальный код WEBDAV для этого вопроса. И технически вам также не нужно полагаться на IANA, если это что-то 4xx, это понятно для любого пользовательского агента HTTP, см. Спецификации HTTP. Это просто вопрос, что вы хотите. – hakre

+1

Ну, 422 - это код в реестре кодов состояния IANA, определенный в RFC стандартов стандартов IETF. 478 нет. –

+1

И что? Потребуются годы до тех пор, пока не будет использовано 478, и когда это будет так, и вы создали общие средства вокруг него, IETF это отразит. Особенно, если клиент является вашим собственным контролируемым клиентом AJAX, вам не о чем беспокоиться вне вашего домена. Даже, вероятно, более разумно использовать неиспользуемый код состояния, чем повторное использование чего-либо, из которого IANA уже заявляет, что оно используется для определенной цели - подключения WEBDAV. – hakre

Смежные вопросы