【问题标题】:Java HttpURLConnection.getInputStream but get 401 IOExceptionJava HttpURLConnection.getInputStream 但得到 401 IOException
【发布时间】:2014-06-28 21:33:06
【问题描述】:

我正在用 Java 为 CouchDB 编写一个 REST 客户端。下面的代码应该很标准:

    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);
    }

我想测试如果身份验证失败会发生什么。但是,如果身份验证失败,当调用 HttpURLConnection 的getInputStream 时,我会直接收到一个 IOException,说明服务器响应 401。我想如果服务器响应某些内容,无论成功还是失败,它都应该能够读取服务器返回的任何内容.而且我确信在这种情况下服务器确实会在正文中返回一些文本,因为如果我使用 curl 对服务器执行GET 并且身份验证失败,我会得到一个 JSON 对象作为响应正文,其中包含一些错误消息.

即使是 401,有什么办法仍然可以获取响应正文吗?

【问题讨论】:

  • 您可以用 for 循环替换 while 以使代码更具可读性

标签: java httpresponse httpurlconnection http-status-code-401


【解决方案1】:

this question:

“根据 javadocs,HttpURLConnection.getErrorStream 方法将返回一个 InputStream,可用于从错误条件(例如 404)中检索数据。”

【讨论】:

    【解决方案2】:

    您需要使用getResponseCode() 检查http 状态,以决定您应该使用getInputStream() 还是getErrorStream()。在这种情况下,您需要读取错误流。

    【讨论】:

    • 谢谢!我会接受您的回复作为答案,但可能只有一个答案......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    相关资源
    最近更新 更多