如何获得响应正文使用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())); }