私たちのアプリには2つの部分があります。サーバー - RESTサービスとクライアントを提供する - Spring restTemplateを使用してそれらを消費します。java.net.HttpRetryException:サーバー認証、ストリーミングモードで再試行できません
HTTPステータスに加えて、私たちのサーバは、エラーを詳細に記述するJSONとともにHTTP本体を返します。 それで、私はcustimエラーハンドラをrestTemplateに追加して、エラーではないものとしてコード化されたエラーを処理しました.HTMLボディをよく解析するのに役立ちます。
しかし、HTTP/1.1 401 Unauthorizedの場合はHTTPボディの解析で例外が発生します。 他のすべてのエラーコードは、エラーの場合にHTTP応答を送信する私たちは、プレーンなサーバー・ロジックを使用しているファイン(400、402、など) に処理され、エラーの種類ごとに特別なルールません:
writeErrorToResponse(int status, String errMsg, HttpServletResponse resp) throws IOException {
response.setStatus(status);
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
String message = String.format("{\"error\":\"%s\"}", StringUtils.escapeJson(errMsg));
resp.getWriter().println(message);
}
しかし、上クライアントのみHTTP/1.1 401は例外をスロー - "java.net.HttpRetryException: cannot retry due to server authentication, in streaming mode"
私はいくつかのデバッグを行い、問題の原因はSimpleClientHttpResponseのコードで見てきました:
HttpURLConnection.getInputStream()
私の質問は、Javaの原因となることができるものであるHTTP/1.1 401 Unauthorized
X-Powered-By: Servlet/3.0
Content-Type: application/json
Content-Language: en-GB
Content-Length: 55
Date: Sat, 25 May 2013 11:00:21 GMT
Server: WebSphere Application Server/8.0
{"error":"I cant find that user. Please try again."}
: メッセージがクライアント上で正しく解析されます:
HTTP/1.1 402 Payment Required
X-Powered-By: Servlet/3.0
Content-Type: application/json
Content-Language: en-GB
Content-Length: 55
Connection: Close
Date: Sat, 25 May 2013 10:10:44 GMT
Server: WebSphere Application Server/8.0
{"error":"I cant find that user. Please try again."}
、例外の原因であるメッセージフィドラーでトレース
は私に次の応答を持っていますこの状況で.net.HttpRetryException?
さらに、:このメカニズムはうまくいきました。しかし、私たちはアプリで多くのコードを変更しています。
が、私は同じ問題を抱えていますHttpClientPolicy使用してチャンクを無効にするにはどうすればよいこれを解決するには? – user1182217
私は回避策を立てました:1)エラーとして403を処理するカスタムエラーハンドラに追加されました。 2)例外をキャッチし、403エラーコードを処理します。しかし、この場合、HTTP本体を解析することはできません。 –
@ user1182217私の答えを見る –