I am writing a REST client for CouchDB in Java. The following code should be quite standard:
this.httpCnt.connect();
Map<String, String> responseHeaders = new HashMap<>();
int i = 1;
while (true){
String headerKey = this.httpCnt.getHeaderFieldKey(i);
if (headerKey == null)
break;
responseHeaders.put(headerKey, this.httpCnt.getHeaderField(i));
i++;
}
InputStreamReader reader = new InputStreamReader(this.httpCnt.getInputStream());
StringBuilder responseBuilder = new StringBuilder();
char[] buffer = new char[1024];
while(true){
int noCharRead = reader.read(buffer);
if (noCharRead == -1){
reader.close();
break;
}
responseBuilder.append(buffer, 0, noCharRead);
}
I want to test what happen if the authentication fails. However if the authentication fails, when calling getInputStream
of the HttpURLConnection, I get directly an IOException saying the server responses 401. I suppose if the server responses something, no matter success or failure, it should be able to read whatever the server returns. And I am sure in this case the server does return some text in the body, since if I do a GET
to the server using curl and the authentication fails, I get a JSON object as the response body with some error messages in it.
Is there any way to still get the response body even if 401?
You need to check for the http status using getResponseCode()
to decide if you should use getInputStream()
or getErrorStream()
. In this case, you need to read the error stream.