当返回2xx以外的代码时,如何使用HttpURLConnection获取响应正文?

2022-08-31 08:41:51

我在检索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."}]}

我可以使用以下方法获取响应消息(即“内部服务器错误”)和代码(即“500”):

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

但我无法检索请求正文...也许有一些我在图书馆没有注意到的方法?


答案 1

如果响应代码不是 200 或 2xx,请使用getErrorStream()getInputStream().


答案 2

错误使用了错误的方法,这是工作代码:

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()));
}

推荐