35

我正在尝试通过 Android 发送一个 GET HttpURLConnection(从 导入org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection),并在收到响应后,抛出一个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

4 回答 4

50

我找到了原因。

首先,对于所有不知道这个错误意味着什么的人(我肯定没有):如果服务器回复 401,就会抛出这个异常。非常直观,考虑到它是在 getResponseCode() 中抛出的(iow您永远无法自己检查 401,而是必须捕获此 IOException ......)。

401 的实际原因是我没有在此时预期的位置发送 OAuth 验证器代码。

于 2009-08-31T14:04:10.353 回答
13

也许对某人有用...

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

于 2012-03-18T21:01:15.613 回答
4

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

WWW-Authenticate: None
于 2014-02-24T13:13:32.780 回答
2

请注意,有两种身份验证方法:HTTP 身份验证基于令牌的身份验证。如果您使用的是 HTTP 身份验证,那么您必须遵循参考规范:在服务器端包含WWW-Authenticate标头字段,在java.net.Authenticator本地使用等。如果您使用的是基于令牌的身份验证,那么显然您必须使用 cookie 来存储令牌并制作能够保持长期有效的会话。在这种情况下,将下一个代码放入android.app.Application.onCreate()

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

并且在没有WWW-Authenticate标头字段的情况下从服务器接收 HTTP 401 时不会有麻烦。

于 2014-05-26T09:35:57.593 回答