HttpURLConnect InputStreamは非200応答コードを読み、エラーのget InputStream
記事の目次より素晴らしいです. 背景: 、エラーシーン還元 グローバル異常ブロック: HttpRequest Utilツールクラスの方法(サービスに対する要求を開始するためのもの): 、エラー位置決め 、ソリューション HttpRequest Util送信要求を修正するツールクラス: 著者の無料ソースの福祉、より多くの推薦は、 をダウンロードすることを歓迎します.
もっと素晴らしいです
もっと素晴らしい訪問をお願いします.http://www.gzdangfu.com
背景:
サービスエンド項目ではグローバル異常ブロックによって異常処理が行われますが、ユニットテストを行ってJava元のHttpURLConnection方法でサービスにアクセスした場合、異常処理後の応答体の内容が読み取れなくなり、直接にエラーが発生しました.ここに解決策を記録します.
一、エラーシーンの復元
まず、エラーが発生した時のコードはどう書きますか?
カスタムエラーのコードを投げました.
しかし、postJson Parames方法で要求を開始した場合、サービス端末の応答内容を取得できませんでした.エラーメッセージは以下の通りです.
応答体を読み取る方法を見てください.
Returns the error stream if the connection failed but the server sent useful data nonetheless.
この方法によって、
三、解決策
HttpRequest Util送信要求のツールクラスを修正します.
作者の無料ソースの福祉、より多くの推薦、ダウンロード学習を歓迎します. androidの比較的完全なソースコードの統合+企業レベルのアプリケーションの共有、従業員の蓄積 JAVAこの言語はどうやって卒業したばかりのおかず鳥から月給15 K以上のエンジニアになりますか? Android Android車輪子大全例庫ダウンロードAndroidソース
もっと素晴らしいです
もっと素晴らしい訪問をお願いします.http://www.gzdangfu.com
背景:
サービスエンド項目ではグローバル異常ブロックによって異常処理が行われますが、ユニットテストを行ってJava元のHttpURLConnection方法でサービスにアクセスした場合、異常処理後の応答体の内容が読み取れなくなり、直接にエラーが発生しました.ここに解決策を記録します.
一、エラーシーンの復元
まず、エラーが発生した時のコードはどう書きますか?
カスタムエラーのコードを投げました.
try {
service = (MoerService) SpringContextHolder.getBean(serviceImpl);
} catch (Exception e) {
throw new SystemException(ErrorMessageConstants.NOT_BEAN_ERROR);
}
グローバル異常ブロック:/**
*
*
* @Author ---
* @Date: --
*/
@ControllerAdvice
public class GlobalExceptionHandler {
private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
*
*/
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public Result exception(Exception e) {
logger.error(" :", e);
return Result.fail(ErrorMessageConstants.ABNORMAL_ERROR);
}
/**
*
*/
@ExceptionHandler(SystemException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public Result systemException(SystemException e) {
logger.error(" :", e);
return Result.fail(e.getMessage());
}
/**
*
*/
@ExceptionHandler(BussinessException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseBody
public Result bussinessException(BussinessException e) {
logger.error(" :", e);
return Result.fail(e.getMessage());
}
HttpRequest Utilツール類の方法(サービスに対する要求を開始するためのもの):public static String postJsonParams(String requestUrl, String requestMethod, String params) {
StringBuilder sb = new StringBuilder();
try {
URL url = new URL(requestUrl);//
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setInstanceFollowRedirects(true);
connection.setRequestMethod(requestMethod); //
connection.setRequestProperty("Accept", "application/json"); //
connection.setRequestProperty("Content-Type", "application/json"); //
connection.connect();
OutputStreamWriter out = new OutputStreamWriter(
connection.getOutputStream(), "UTF-8"); // utf-8
out.append(params);
out.flush();
out.close();
if (connection != null) {
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line);
sb.append("\r
");
}
br.close();
}
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
サービス側がSystem Exception()を投げ出すと、異常ブロックGlobal Exception Handlerによって処理され、その後return Result.fail(e.get Message()によって、カスタムフレンドリーエラーメッセージを返します.しかし、postJson Parames方法で要求を開始した場合、サービス端末の応答内容を取得できませんでした.エラーメッセージは以下の通りです.
java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:8885/moerService/access
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1839)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440)
at com.moerlong.service_authorize.util.HttpRequest.postJsonParams(HttpRequest.java:94)
at com.moerlong.service_authorize.controller.AccessController.test(AccessController.java:91)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
......
二、エラーポジショニング :Server returned HTTP response code: 500, 500 ;
異常ブロックの中の@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) response 500, ?
を見ます.HttpClient
を介して以前にこのような問題に遭遇していない要求を送信しましたが、HttpURLConnection
APIがresponseCode 500
を読み取れない場合の応答体の内容ですか?応答体を読み取る方法を見てください.
if (connection != null) {
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line);
sb.append("\r
");
}
br.close();
}
私たちはconnection.getInputStream()
方法で入力ストリームを取得して応答体の内容を読み取ります.しかし、このAPIはresponseCode=200
時の応答内容しか読み取れません.HttpURLConnection
のAPI文書を閲覧すると、非常に前の方法getErrorStream()
が見られます.Returns the error stream if the connection failed but the server sent useful data nonetheless.
この方法によって、
responseCode 200
時(connection failed)
の応答内容(useful data)
を取得することができたのです.三、解決策
HttpRequest Util送信要求のツールクラスを修正します.
public static String postJsonParams(String requestUrl, String requestMethod, String params) {
StringBuilder sb = new StringBuilder();
try {
URL url = new URL(requestUrl);//
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setInstanceFollowRedirects(true);
connection.setRequestMethod(requestMethod); //
connection.setRequestProperty("Accept", "application/json"); //
connection.setRequestProperty("Content-Type", "application/json"); //
connection.connect();
OutputStreamWriter out = new OutputStreamWriter(
connection.getOutputStream(), "UTF-8"); // utf-8
out.append(params);
out.flush();
out.close();
if (connection != null) {
InputStream inputStream = null;
// responseCode , ( )
if (HttpURLConnection.HTTP_OK == connection.getResponseCode()) {
inputStream = connection.getInputStream();
} else {
inputStream = connection.getErrorStream();
}
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line);
sb.append("\r
");
}
br.close();
}
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
コア:if (HttpURLConnection.HTTP_OK == connection.getResponseCode()) {
inputStream = connection.getInputStream();
} else {
inputStream = connection.getErrorStream();
}
ResponseCode
に基づいてgetInputStream/getErrorStream API
を選択すればいいです.作者の無料ソースの福祉、より多くの推薦、ダウンロード学習を歓迎します.