Java HttpURLConnection.getInputStream 但得到 401 IOException

Posted

技术标签:

【中文标题】Java HttpURLConnection.getInputStream 但得到 401 IOException【英文标题】:Java HttpURLConnection.getInputStream but get 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 以使代码更具可读性 【参考方案1】:

见this question:

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

【讨论】:

【参考方案2】:

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

【讨论】:

谢谢!我会接受您的回复作为答案,但可能只有一个答案......

以上是关于Java HttpURLConnection.getInputStream 但得到 401 IOException的主要内容,如果未能解决你的问题,请参考以下文章

Java Math

Java 布尔运算

java [Java] Java常用代码#java

Java - 35 Java 实例

Java While 循环

Java 字符串