Можем ли мы создать собственные коды статуса HTTP? - PullRequest
72 голосов
/ 03 ноября 2011

У меня есть служба REST и WCF, и я хочу отправить пользовательский код состояния в зависимости от операции.

Пример, когда при какой-либо проверке происходит сбой, я хочу отправить HTTP 444, а при неудачной авторизации я хочу отправить HTTP 455

Вопрос в том, как мы можем проверить его для веб-служб SOAP и REST.

На клиенте, как действует код ошибки, потому что при отправке HTTP 400/500 из службы WCF (с использованием SOAP) на клиенте выдается исключение, отображающее код состояния.

Теперь, если я отправлю новый пользовательский код состояния, как клиент справится с этим?

Ответы [ 5 ]

89 голосов
/ 08 августа 2012

Да, если вы уважаете класс - то есть, 2xx для успеха, 4xx для ошибки клиента и т. Д. Таким образом, вы можете возвращать пользовательские коды ошибок 4XX (предпочтительно те, которые не назначены) для условий ошибок вашего собственного приложения.

Цитировать из [RFC 2616] [1]:

"Коды состояния HTTP расширяемы. Приложения HTTP не требуются чтобы понять значение всех зарегистрированных кодов состояния, хотя такие понимание, очевидно, желательно. Тем не менее, приложения ДОЛЖНЫ понять класс любого кода состояния, как указано первым цифра и обрабатывать любой нераспознанный ответ как эквивалент x00 код состояния этого класса, за исключением того, что нераспознанный ответ НЕ ДОЛЖЕН кэшироваться. Например, если нераспознанный код состояния 431 получен клиентом, он может смело предполагайте, что с его запросом было что-то не так и трактуйте ответ так, как будто он получил код состояния 400. "

Класс

  • 1xx: информационный - запрос получен, продолжение процесса

  • 2xx: Успех - Действие было успешно получено, понял и принял

  • 3xx: Перенаправление - необходимо предпринять дальнейшие действия для завершить запрос

  • 4xx: ошибка клиента - запрос содержит неверный синтаксис или не может быть выполненным

  • 5xx: ошибка сервера - серверу не удалось выполнить явно действительный запрос [1]:

http://tools.ietf.org/html/rfc2616#section-6.1.1

30 голосов
/ 03 ноября 2011

Я не рекомендую создавать свои собственные коды состояния HTTP, когда применимые коды уже существуют для вещей, которые вы хотите сделать в своем примере.

С https://tools.ietf.org/html/rfc4918#section-11.2:

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

Можно утверждать, что "невозможно обработать"может быть связано с ошибкой проверки.

17 голосов
/ 04 апреля 2013

Да, вы можете добавить пользовательские коды ошибок.Если возможно, используйте уже существующие коды, и если вы объявляете новые, будьте осторожны, чтобы избежать коллизий.

Однако вы должны знать, что некоторые прокси фильтруют неизвестные коды .У меня были проблемы с пользователями, которые находились за прокси-серверами, которые отображали 5XX на 500 и 4XX на 404. Это делало мои ajax-вызовы там, где проверка кода состояния не удалась.

10 голосов
/ 29 марта 2017

Некоторые приложения добавляют свои собственные коды ответов в диапазоне 600-799. Проверьте, например, список кодов ответов из KeyNote здесь

Ключевые коды ошибок (600-799)

600: CONNECTION ERROR - This indicates a general connection error
601: INCOMPLETE ERROR - This indicates sever sends an incomplete page/object (as indicated by Content-Length header)
602: UNEXPECTED CLOSE ERROR - This indicates socket connection has been closed unexpectedly
603: REFUSED ERROR - This indicates a request to connect to the server is refused
604: TIMEOUT ERROR - This indicates there is no activity in socket connection in 3 minutes
605: REDIRECT ERROR - This indicates an error in redirect HTTP header
606: SSL ERROR - This indicates a general error in SSL
607: HEADER ERROR - This indicates a malformed HTTP header
608: EMPTY RESPONSE ERROR - This indicates server doesn't send any response after a request is sent
609: UNKNOWN HOST ERROR - This indicates socket receives an unknown host error from DNS
610: NO ROUTE TO HOST ERROR - This indicates a no route to host error was received while attempting to open a socket
611: SOCKET ERROR - This indicates a general socket error
612: FRAME LOOP ERROR - This indicates a page has a frame loop (frame A includes Frame B that includes Frame A)
613: REDIRECT LOOP ERROR - This indicates a page has a redirect loop (page A redirects to page B that redirects to page A)
614: CONNECTION RESET ERROR - This indicates socket receive a reset signal from the server
615: SOCKET PROTOCOL ERROR - This indicates an error in socket protocol
616: SOCKET BIND ERROR - This indicates an error in binding the socket
617: CONNECTION ERROR - This indicates a general socket connection error
618: CHUNK ERROR - This indicates an error in chunked encoding
619: SSL TIMEOUT - This indicates a timeout during SSL handshake (2 minutes)
620: SSL END OF INPUT - This indicates an end-of-file is received during SSL handshake
621: SSL HANDSHAKE ERROR - This indicates a general error during SSL handshake
622: SSL CERTIFICATE ERROR - This indicates an error in SSL certificate verification
623: SSL AUTHENTICATION ERROR - This indicates an authentication error during SSL handshake
624: SSL BAD MAC ERROR - This indicates a bad MAC during SSL handshake
625: SSL CIPHER ERROR - This indicates a cipher error during SSL handshake
701: ERROR TEXT FOUND - This code is returned if any error text (such as, "Service Unavailable") are found in the main page (frame HTML contents included). Note that the error text must be defined in advance of the test. Error text means if the text is found, this session should be considered a failure.
702: REQUIRED TEXT NOT FOUND - This code is returned If not all required texts are found in the main page. Note that required text must be defined in advance of the test. Required text means if the text is not found, this session should be considered a failure.
703: HTML BODY EMPTY - This code is returned if the HTML body of the page is empty (only if error text or required text has been defined).

Я бы не осмелился сказать, является ли это хорошей практикой, но это, по крайней мере, интересная ссылка.

0 голосов
/ 03 ноября 2011

Нет, вы можете использовать только код требований к документации rfc, подробности см. В RFC1945

...