IOException:“收到的身份验证质询为空”(Apache Harmony / Android)

时间:2009-08-31 13:04:57

标签: java android httpurlconnection

我正在尝试通过Android的 HttpURLConnection (从 org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection 导入)发送GET,并在收到回复时 IOException :

  doRequestInternal()中的

:“收到的身份验证质询为空”

这个错误是什么意思,是什么导致了这个?我正在将OAuth参数写入Authorization标头,但我也会在其他场合这样做,没有问题。

    if (connection == null) {
        connection = (HttpURLConnection) new URL(endpointUrl).openConnection();
        connection.setRequestMethod("GET");
    }

    //... do some OAuth message signing

    connection.connect();

    int statusCode = connection.getResponseCode(); // throws IOException

4 个答案:

答案 0 :(得分:50)

我找到了原因。

首先,对所有不知道这个错误意味着什么的人(我肯定不是): 如果服务器回复401,则抛出此异常。非常直观,考虑到它是在getResponseCode()中抛出的(哇,你永远不能自己检查401s,但必须反而抓住这个IOException ...)。

401的实际原因是我没有发送OAuth验证程序代码,此时此处是预期的。

答案 1 :(得分:13)

也许对某人有用......

此异常仅表示格式错误的答案标题:未找到“WWW-Authenticate”标题。 此外,不支持使用401代码的分块答案,因此您需要“Content-Length”标题(可以为零)。

答案 2 :(得分:4)

只需将此标头添加到请求中(在服务器端):

WWW-Authenticate: None

答案 3 :(得分:2)

请注意,有两种身份验证方法:HTTP Authenticationtoken-based authentication。如果您正在使用HTTP身份验证,则必须遵循引用的规范:在服务器端包含 WWW-Authenticate 标头字段,在本地使用java.net.Authenticator等。如果您使用基于令牌的身份验证,那么很明显,你必须使用cookie来存储令牌,并使长寿会话保持活力。在这种情况下,将下一个代码放入android.app.Application.onCreate()

CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);

如果没有 WWW-Authenticate 标题字段从服务器接收HTTP 401,您将不会遇到麻烦。