Чи можемо ми створити власні коди статусу HTTP?


92

Я маю службу REST та WCF і хочу надіслати власний код стану на основі операції.

Приклад, коли якась перевірка не вдається, тоді я хочу надіслати HTTP 444, а коли авторизація не вдається, я хочу надіслати HTTP 455

Питання в тому, як ми перевіряємо його як для SOAP, так і для веб-служб REST.

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

Тепер, якщо я надсилаю новий спеціальний код стану, як клієнт з цим справляється?


3
Це послуга, яку ви виставляєте світові, або ви також контролюєте всіх клієнтів?
Rup

Відповіді:


109

Так, доки ви поважаєте клас - тобто 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


2
Не використовуйте незареєстровані коди стану, крім тестування.
Джуліан Решке

1
ChrisNY: ну, якщо ви використовуєте незареєстровані коди стану при використанні HTTP, може статися поломка, якщо хтось інший використовує той самий код з іншою метою. Якщо вам потрібна більш детальна інформація про помилку, ви все ще можете вбудувати її в корисне навантаження (див., Наприклад, tools.ietf.org/html/draft-nottingham-http-problem-06 )
Джуліан Решке

21
@ChrisNY: Більшість веб-додатків розроблені для роботи з одним клієнтом (ваш код javascript / ajax) та одним сервером (вашим сервером), тому використання власного коду стану цілком нормально. У цих ситуаціях навіть "хтось інший" не може спричинити "поломку", використовуючи той самий код стану.
AR

2
Ця цитата не говорить про те, що ви можете складати власні коди, вона говорить про те, що вашій програмі не потрібно знати, що таке кожен зареєстрований код, якщо він поважає клас коду і видає помилку для 4xx тощо. єдине питання, яке я міг бачити, полягає в тому, що в майбутньому один із цих кодів отримує офіційне присвоєння, і функціональність браузера / javascript може змінитися. напр., 494 DDNS-атака зупиняє будь-який зв’язок, браузер може це побачити та заблокувати js більше не ініціювати комунікації на цей ip. Дуже малоймовірно, але ви не можете бути на 100%, Twitter, здається, вважає, що це нормально робити 420 Посильте свій спокій
Метт

1
Специфікація говорить, що ви можете складати власні коди, і використовує код 471 як приклад. Там сказано припускати будь-яку невизнану помилку 4xx як еквівалент 400.
Джеф Лоуері

32

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

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

Код стану 422 [Unprocessable Entity] означає, що сервер розуміє тип вмісту сутності запиту (отже, код стану 415 [Непідтримуваний тип носія] невідповідний), а синтаксис сутності запиту правильний (таким чином, 400 [Поганий запит ] код стану невідповідний), але не зміг обробити інструкції, що містяться. Наприклад, ця умова помилки може виникнути, якщо тіло запиту XML містить чітко сформовані (тобто синтаксично правильні), але помилкові в семантичному плані інструкції XML.

Можна стверджувати, що "нездатність обробити" може бути наслідком помилки перевірки.


10
Помилка авторизації - 401, а не 403. 403 заборонено, коли авторизація не вирішить проблему.
Ніл Хікман,

6
401 - про невдалу автентифікацію (незважаючи на назву).
Джуліан Решке

1
401 - "Будь ласка, увійдіть (знову)"
CodesInChaos

19

Так, ви можете додати власні коди помилок. Якщо можливо, використовуйте коди, які вже існують, і якщо ви заявляєте нові, будьте обережні, щоб уникнути зіткнень.

Вам слід пам’ятати, що деякі проксі-сервери фільтрують невідомі коди . У мене були проблеми з користувачами, які стояли за проксі-серверами, які зіставляли 5XX на 500 та 4XX на 404. Це змусило мій ajax зателефонувати, щоб перевірити код стану не вдалося.


так, довірені особи смокчуть. Я не знаю ім’я реалізації проксі, але воно самостійно інтерпретувало наш власний код стану і не надсилало відповідь клієнту.
asgs

16

Деякі програми додають власні коди відповідей у ​​діапазоні 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).

Чи це хороша практика, я б не наважився сказати, але це принаймні цікаве посилання.


1
Ці значення є незаконними, оскільки специфікація HTTP не дозволяє нічого за межами 100 ... 599.
Джуліан Решке

16
@JulianReschke Я навіть згадав, що "не наважуюся сказати, чи це є доброю практикою". Я просто додаю посилання на те, що роблять інші програми. Голосування проти моєї відповіді, оскільки Keynote використовує незаконні коди статусу, здається невиправданим. Я лише живлю дискусію.
Уілт


-12

Ні, ви можете використовувати лише код вимог до документації RFC, див. Деталі в RFC1945


4
Ви можете використовувати будь-який код стану, визначений у iana.org/assignments/http-status-codes .
Джуліан Решке

@Julian, чи означає це, що Раджеш може використовувати для своїх цілей "427-499 без призначення"?
IrishChieftain

Добре тоді :-) Ви можете використовувати будь-який призначений код стану з цього списку. Або ви пишете специфікацію нового коду стану та реєструєте його.
Джуліан Решке

5
Ви можете технічно використовувати все, що завгодно. Тільки не чекайте, що це добре зіграє з кимось іншим. Як запитують в ОП - якщо Раджеш контролює всіх клієнтів, він може дати їм зрозуміти "1337 - вся ваша база належить нам", це їм так подобається. ;)
Корнелій

1
Ви пов’язали з кодами стану HTTP / 1.0, який не використовувався з початку 90-х.
andsens
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.