1. ホーム
  2. java

[解決済み] 2xx以外のコードが返された場合、HttpURLConnectionを使用してレスポンスボディを取得するにはどうすればよいですか?

2022-09-28 20:30:26

質問内容

サーバーがエラーを返した場合、Jsonレスポンスを取得するのに問題があります。詳細は以下をご覧ください。

リクエストの実行方法

私は java.net.HttpURLConnection . 私は要求のプロパティを設定し、私が行う。

conn = (HttpURLConnection) url.openConnection();

その後、リクエストに成功すると、レスポンスのJsonを取得します。

br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
sb = new StringBuilder();
String output;
while ((output = br.readLine()) != null) {
  sb.append(output);
}
return sb.toString();

...そして、問題なのは

サーバーが50xや40xのようなエラーを返すと、受信したJsonを取り出すことができないのです。以下の行はIOExceptionを投げています。

br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
// throws java.io.IOException: Server returned HTTP response code: 401 for URL: www.example.com

サーバーがボディを送信しているのは確かで、外部ツールのBurp Suiteで確認できます。

HTTP/1.1 401 Unauthorized

{"type":"AuthApiException","message":"AuthApiException","errors":[{"field":"email","message":"Invalid username and/or password."}]}

以下の方法で、応答メッセージ(例:"Internal Server Error")とコード(例:"500")を取得することができます。

conn.getResponseMessage();
conn.getResponseCode();

しかし、リクエストボディを取得することができません...もしかしたら、ライブラリに私が気づいていないメソッドがあるのでしょうか?

どのように解決するのですか?

間違ったメソッドを使用したためにエラーが発生しました。

BufferedReader br = null;
if (100 <= conn.getResponseCode() && conn.getResponseCode() <= 399) {
    br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
    br = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}