【问题标题】:IOException: "Received authentication challenge is null" (Apache Harmony/Android)IOException:“收到的身份验证质询为空”(Apache Harmony/Android)
【发布时间】:2010-11-24 08:23:25
【问题描述】:

我正在尝试通过 Android 的 HttpURLConnection(从 org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection 导入)发送 GET,并且在收到响应后,IOException strong> 被抛出:

在 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

【问题讨论】:

标签: java android httpurlconnection


【解决方案1】:

请注意,有两种身份验证方法: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 时不会遇到麻烦。

【讨论】:

    【解决方案2】:

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

    WWW-Authenticate: None
    

    【讨论】:

      【解决方案3】:

      也许对某人有用...

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

      【讨论】:

      • 客户端需要发送“授权”标头,如果服务器不喜欢凭据,则需要发回WWW-Authenticate。在我的情况下,它是我们的服务器,并且仅在缺少 Authorization 标头时才发送 WWW-Authenticate。为了修复主题中的错误,我们在服务器端进行了更改,以便在授权失败时发送WWW-Authenticate
      【解决方案4】:

      我找到了原因。

      首先,对于所有不知道此错误意味着什么的人(我确定不知道): 如果服务器回复 401,则会引发此异常。非常直观,考虑到它是在 getResponseCode() 中引发的(因为您永远无法自己检查 401,但必须改为捕获此 IOException...)。

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

      【讨论】:

      • 嗨,Matthias,您使用的是 twitter api 吗?
      • 不,我在 Signpost 的 DefaultOAuthProvider 实现中遇到了这个问题,它使用 HTTPUrlConnection 而不是 Apache HttpClient。
      • 你坚持使用路标吗?我在 android 上遇到了很多麻烦。
      • 是的——我开发了它!这个问题大约有一年的历史,同时我添加了一个不受此问题影响的 CommonsHttpOAuthProvider 。 i.o.w.您现在可以在没有任何 java.net 类的情况下使用 Signpost,这些类在 Harmony/Android 中存在缺陷。
      • 我刚刚经历了这个,发现我的情况是手机上的系统时间晚了两天。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      相关资源
      最近更新 更多