this is my first question on stack, I hope I'll find some help :)
I have problem with retrieving Json response in case when server returns error. See details below.
How do I perform request
I use following libraries:
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
First, I setup request properties:
conn.setRequestProperty("Accept", "application/json");
url = new URL(www.example.com);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(requestType);
conn.setRequestProperty("Authorization", token);
After that, when request is successful, I get response Json:
br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
sb = new StringBuilder();
String output;
while ((output = br.readLine()) != null) {
sb.append(output);
return sb.toString();
... and the problem is:
I can't retrieve Json received when the server returns some error like 50x or 40x,. Following line throws IOException:
br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
// result: java.io.IOException: Server returned HTTP response code: 401 for URL: www.example.com
The server sends body for sure, I see it in external tool Burp Suite:
HTTP/1.1 401 Unauthorized
{"type":"AuthApiException","message":"AuthApiException","errors":[{"field":"email","message":"Invalid username and/or password."}]}
I can get response message (i.e. "Internal Server Error") and code (i.e. "500") using following methods:
conn.getResponseMessage();
conn.getResponseCode();
So I can't retrieve Json response... maybe there is some method I didn't notice in the library? Please help...
I know there are ways around like changing the library (How can I get an http response body as a string in Java?), but I don't want to change The library.
解决方案
If the response code isn't 200 or 2xx, use getErrorStream() instead of getInputStream().