の結果から HTTP ステータスを取得するにはどうすればよいSOAPConnection.call()
ですか?
5 に答える
SOAP に関する W3C ノート (セクション 6.2)から引用
SOAP HTTP は、HTTP でステータス情報を通信するための HTTP ステータス コードのセマンティクスに従います。たとえば、2xx ステータス コードは、SOAP コンポーネントを含むクライアントの要求が正常に受信され、理解され、受け入れられたことなどを示します。
リクエストの処理中に SOAP エラーが発生した場合、SOAP HTTP サーバーは HTTP 500 "Internal Server Error" レスポンスを発行し、SOAP 処理エラーを示す SOAP Fault 要素 (セクション 4.4 を参照) を含む SOAP メッセージをレスポンスに含める必要があります。
エラーやステータス情報を含む SOAPBody オブジェクトの要素。この情報は、SOAPMessage オブジェクトのエラー、またはメッセージ自体の内容に関連しない問題に関連している可能性があります。
したがって、考えられる答えは
SoapMessage soapMessage = null;
soapMessage = MySOAPConnection.call(...);
soapMessage.getSOAPPart().getEnvelope().getBody().getFault().getFaultCode();
この回答を作成するのに役立った参考文献は次のとおりです。
簡単な答えは、できません。HttpSOAPConnectionコードを掘り下げると、HttpURLConnection オブジェクトのローカル インスタンスを使用して、ターゲット サービスとの実際の通信が行われます。これは httpResponse コードを取得しますが、多かれ少なかれ完全に呼び出し元から隠します。結論としては、例外は発生しないが、返された SOAPMessage に SOAPFault が含まれている場合、戻りコードは HttpURLConnection.HTTP_INTERNAL_ERROR (つまり 500) でした。例外も SOAPFault もないということは、戻りコードが 200 から 206 であり、すべて「成功」であることを意味します。残念ながら、HttpURLConnection オブジェクトの HTTP ヘッダーからのステータス エントリは、返された SOAPMessage の MIMEHeaders に明示的にコピーされません。
// Header field 0 is the status line so we skip it.
それ以外の場合は例外が発生し、コードは例外のメッセージ フィールドの開き括弧の後に開始され、おそらく 3 桁です。誰かがメッセージの前に閉じ括弧やその他の区切り記号を忘れたため、正確にするのは困難です...
throw new SOAPExceptionImpl(
"Bad response: ("
+ responseCode
+ httpConnection.getResponseMessage());
例えば:
com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Bad response: (502internal error - server connection terminated
例外でテキスト メッセージの書式設定に依存するのは恐ろしいことですが、応答コードはどこにも公開されていません。
ビジネス アナリストは、すべてのインバウンドおよびアウトバウンドの SOAP 呼び出しに関連するすべての HTTP 応答コードをログに記録したいと考えています。私の回答は、Apache CXF 2.7.5 に対して有効です。
javax.xml.ws.handler.soap.SoapHandler インターフェイスの実装で以下のコード フラグメントを使用すると、MessageContext インターフェイス経由で http ステータス コードにアクセスできます。
int status = (( javax.servlet.http.HttpServletResponse)messageContext.get("HTTP.RESPONSE")).getStatus();