Java HttpURLConnection.getInputStream but get 401

2019-01-28 00:46发布

问题:

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?

回答1:

See this question:

"The HttpURLConnection.getErrorStream method will return an InputStream which can be used to retrieve data from error conditions (such as a 404), according to the javadocs."



回答2:

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.