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

这是我的第一个问题在堆栈上,我希望我会find一些帮助:)

我有检索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套件:

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

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

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

但我不能检索请求主体…也许有一些方法,我没有注意到在图书馆? 请帮忙…

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

为了让事情变得清晰起来,下面是我的工作代码:

 if (200 <= conn.getResponseCode() && conn.getResponseCode() <= 299) { br = new BufferedReader(new InputStreamReader(conn.getInputStream())); } else { br = new BufferedReader(new InputStreamReader(conn.getErrorStream())); }