カスタムHTTPステータスコードを作成できますか?


92

RESTおよびWCFサービスがあり、操作に基づいてカスタムステータスコードを送信したいと思います。

いくつかの検証が失敗した場合、HTTP 444を送信したい、承認が失敗した場合、HTTP455を送信したい例

問題は、SOAPとRESTの両方のWebサービスに対してどのように検証するかです。

クライアントでは、WCFサービスから(SOAPを使用して)HTTP 400/500を送信すると、ステータスコードを示す例外がクライアントにスローされるため、エラーコードはどのように機能しますか。

新しいカスタムステータスコードを送信した場合、クライアントはこれをどのように処理しますか?


3
これはあなたが世界に公開しているサービスですか、それともすべてのクライアントを制御していますか?
Rup 2011年

回答:


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
テストを除いて、未登録のステータスコードを使用しないでください。
ジュリアンレシュケ2014

1
ChrisNY:ええと、HTTPの使用で未登録のステータスコードに依存している場合、他の誰かが別の目的で同じコードを使用すると、破損する可能性があります。より詳細なエラー情報が必要な場合でも、ペイロードに埋め込むことができます(たとえば、tools.ietf.org / html / draft
nottingham

21
@ChrisNY:ほとんどのWebアプリケーションは、単一のクライアント(javascript / ajaxコード)と単一のサーバー(サーバー)で動作するように設計されているため、カスタムステータスコードを使用してもまったく問題ありません。このような状況では、同じステータスコードを使用して「他の誰か」が「破損」を引き起こすことさえ不可能です。
AR

2
その引用は、独自のコードを作成できると言っているのではなく、コードクラスを尊重し、4xxなどのエラーをスローする限り、登録されているすべてのコードが何であるかをアプリが知る必要はないということです。私が見ることができた唯一の問題は、将来、これらのコードの1つが正式に割り当てられ、ブラウザー/ JavaScriptの機能が変更される可能性があることです。たとえば、494 DDNS攻撃はすべての通信を停止し、ブラウザはそれを認識し、jsがそのIPへの通信を開始するのをブロックする可能性があります。可能性は非常に低いですが、100%になることはできません。Twitterは、420 ​​Enhance Your Calm
Matt

1
仕様では、独自のコードを作成できるとされており、例としてコード471を使用しています。それは400と同等として認識されないの4xxエラーと仮定すると言う
ジェフ・ロウリー

32

例で実行したいことに対して適切なコードがすでに存在する場合は、独自のHTTPステータスコードを作成しないことをお勧めします。

  • 処理できない障害:ステータス422
  • 承認の失敗:ステータス403

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

422 [Unprocessable Entity]ステータスコードは、サーバーがリクエストエンティティのコンテンツタイプを理解し(したがって、415 [Unsupported Media Type]ステータスコードが不適切)、リクエストエンティティの構文が正しいことを意味します(したがって、400 [Bad Request ]ステータスコードは不適切です)が、含まれている命令を処理できませんでした。たとえば、このエラー状態は、XML要求本文に整形式(つまり、構文的に正しい)であるが、意味的に誤ったXML命令が含まれている場合に発生する可能性があります。

「処理できない」のは、検証エラーが原因である可能性があると主張できます。


10
承認の失敗は403ではなく401です。承認によって問題が解決されない場合、403は禁止されています。
ニールヒックマン2014年

6
401は失敗した認証に関するものです(名前にもかかわらず)。
ジュリアンレシュケ2014年

1
401は「(もう一度)ログインしてください」
CodesInChaos 2015

19

はい、カスタムエラーコードを追加できます。可能であれば、既存のコードを使用し、新しいコードを宣言する場合は、衝突を避けるように注意してください。

ただし、一部のプロキシは不明なコードをフィルタリングすることに注意してください。5XXを500に、4XXを404にマップしたプロキシの背後にあるユーザーに問題がありました。これにより、ajaxは、ステータスコードのチェックに失敗する場所を呼び出すようになりました。


はい、プロキシは最悪です。プロキシの実装名はわかりませんが、独自にカスタムステータスコードを解釈し、クライアントに応答を送信しませんでした。
asgs 2014

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以外のものを許可しないという点で違法です。
ジュリアンレシュケ2017年

16
@JulianReschke私は「それが良い習慣であるかどうかをあえて言わないでください」とさえ言いました。他のアプリケーションが行うことへの参照を追加するだけです。Keynoteが違法なステータスコードを使用しているため、私の答えに反対票を投じることは不当なようです。私は議論を養っているだけです。
ウィルト


-12

いいえ、使用できるのはrfcドキュメント要件コードのみです。RFC1945の詳細を参照してください。


4
iana.org/assignments/http-status-codesで定義されている任意のステータスコードを使用できます。
ジュリアンレシュケ2011年

@ジュリアン、これはラジェッシュが彼の目的のために「427-499未割り当て」のものを使用できることを意味しますか?
IrishChieftain 2011年

OK、:-)そのリストから割り当てられたステータスコードを使用できます。または、新しいステータスコードの仕様を記述して、登録します。
ジュリアンレシュケ2011年

5
技術的には、好きなものを何でも使用できます。他の人とうまく遊ぶことを期待しないでください。OPで尋ねられたように、Rajeshがすべてのクライアントを制御している場合、彼はクライアントに「1337-すべてのベースは私たちのものです」と理解させることができます。;)
Cornelius

1
90年代初頭から使用されていないHTTP / 1.0ステータスコードにリンクしました。
andsens 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.