Можем ли мы создать собственные коды состояния HTTP?

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

Например, когда некоторая проверка не проходит, я хочу отправить HTTP 444, а когда авторизация не удается, я хочу отправить HTTP 455.

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

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

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


person Rajesh    schedule 03.11.2011    source источник
comment
Это услуга, которую вы представляете миру, или вы тоже контролируете всех клиентов?   -  person Rup    schedule 03.11.2011


Ответы (6)


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

Цитата из [RFC 2616] [1]:

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

Класс'

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

  • 2xx: Success - действие было успешно получено, понято и принято.

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

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

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

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

person ChrisNY    schedule 08.08.2012
comment
Не используйте незарегистрированные коды статуса, за исключением тестирования. - person Julian Reschke; 27.02.2014
comment
(Извините, меня отключило 5-минутное правило редактирования комментариев ...) Мы используем пользовательские коды состояния на стороне сервера (не назначенные RFC, с соответствующим префиксом класса) для дифференциальной обработки запросов AJAX в JavaScript. В процитированном выше RFC, кажется, ясно говорится, что это нормально, но если это плохая практика, было бы хорошо понять, почему? - person ChrisNY; 28.02.2014
comment
ChrisNY: ну, если вы полагаетесь на незарегистрированные коды статуса при использовании HTTP, может произойти сбой, если кто-то другой использует тот же код для другой цели. Если вам нужна более подробная информация об ошибке, вы все равно можете встроить ее в полезную нагрузку (см., Например, http://tools.ietf.org/html/draft-nottingham-http-problem-06) - person Julian Reschke; 28.02.2014
comment
@ChrisNY: большинство веб-приложений предназначены для работы с одним клиентом (ваш код javascript / ajax) и одним сервером (ваш сервер), поэтому использование настраиваемого кода состояния вполне нормально. В таких ситуациях «кто-то другой» даже не может вызвать «поломку», используя тот же код состояния. - person A.R.; 03.12.2014
comment
Эта цитата не говорит о том, что вы можете создавать свои собственные коды, она говорит о том, что вашему приложению не нужно знать, что такое каждый зарегистрированный код, если он уважает класс кода и выдает ошибку для 4xx и т. Д. Помимо этого, единственная проблема, которую я мог видеть, заключается в том, что в будущем один из этих кодов будет официально назначен, и функциональность браузера / javascript может измениться. например 494 DDNS-атака останавливает все коммуникации, браузер может это увидеть и заблокировать js от инициирования каких-либо сообщений с этим IP-адресом. Маловероятно, но вы не можете быть на 100%, Twitter, похоже, считает, что можно сделать 420 Enhance Your Calm. - person Matt; 03.07.2015
comment
В спецификации говорится, что вы можете составлять свои собственные коды, и в качестве примера используется код 471. В нем говорится, что любая нераспознанная ошибка 4xx эквивалентна 400. - person Jeff Lowery; 27.10.2018
comment
Laravel генерирует 419 , если токен аутентификации отсутствует. Nginx генерирует 499, если клиент закрыл соединение до того, как сервер ответил на запрос. Логи интересны. - person David Tonhofer; 30.01.2019

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

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

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

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

person Julian Reschke    schedule 03.11.2011
comment
Ошибка авторизации - 401, а не 403. 403 запрещено, если авторизация не решит проблему. - person Llanilek; 25.05.2014
comment
401 - о неудачной аутентификации (несмотря на название). - person Julian Reschke; 25.05.2014
comment
401 - Пожалуйста, войдите (снова) - person CodesInChaos; 01.07.2015

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

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

person fmsf    schedule 04.04.2013
comment
да, прокси - отстой. Я не знаю имени реализации прокси, но он интерпретировал наш собственный код состояния самостоятельно и не отправлял ответ клиенту. - person asgs; 03.02.2014

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

Коды ошибок, определенные программой 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).

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

person Wilt    schedule 29.03.2017
comment
Эти значения недопустимы, поскольку спецификация HTTP не допускает ничего, кроме 100 ... 599. - person Julian Reschke; 29.03.2017
comment
@JulianReschke Я даже упомянул, что не смею сказать, хорошая ли это практика. Я просто добавляю ссылку на то, что делают другие приложения. Голосование против моего ответа из-за того, что Keynote использует недопустимые коды состояния, кажется необоснованным. Я только питаю дискуссию. - person Wilt; 29.03.2017

Вот полный список всех доступных / недоступных HTTP кодов.

https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml

Например, следующие обозначенные стрелками доступны для использования (потому что они не назначены) в семействе 4XX.

введите описание изображения здесь

Я надеюсь, что это помогает кому-то.

Спасибо

person Anjana Silva    schedule 12.07.2020

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

person Aimeast    schedule 03.11.2011