IOException: "Received authentication challenge is null" (Apache Harmony/Android) IO异常:"接收到的身份验证挑战为空"(Apache Harmony/Android)

35

我试图通过Android的HttpURLConnection(从org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection导入)发送GET请求,在接收响应时,会抛出一个IOException

在doRequestInternal()中:“接收到的身份验证挑战为null”

这个错误是什么意思,是什么导致了这个错误?我正在将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

这对我来说是工作 https://dev59.com/d3M_5IYBdhLWcg3wSBEU#9894629 - Kishan Vaghela
4个回答

50

我找到了原因。

首先,对于那些不知道这个错误意味着什么的人(我当时也不知道):

如果服务器返回 401 状态码,就会抛出此异常。在 getResponseCode() 中抛出此异常非常直观,无法自行检查 401 状态码,只能捕获此 IOException 异常。

造成 401 错误的实际原因是:在某个位置没有发送 OAuth 验证器代码。


嗨,马蒂亚斯,你使用Twitter API吗? - MounirReg
1
我在使用Signpost的DefaultOAuthProvider实现时遇到了问题,它使用HTTPUrlConnection而不是Apache HttpClient。 - mxk
1
是的 - 我开发了它!这个问题已经有一年了,与此同时我添加了一个CommonsHttpOAuthProvider,它不会受到这个问题的影响。换句话说,现在您可以在Harmony/Android中使用Signpost而无需使用任何java.net类,因为它们存在缺陷。 - mxk
4
我刚刚遇到了这个问题,发现原因是我手机上的系统时间落后了两天。 - Jeremy Haberman
奇怪的是,没有更好的异常类来描述那个特定的情况。 - Snicolas
显示剩余3条评论

13

或许对某些人有用...

这个异常只是意味着回答头部格式错误: "WWW-Authenticate" 头部没有找到。 另外,带有401代码的分块回答不受支持,因此您需要"Content-Length"头部(可以为零)。


4
客户端需要发送“Authorization”头,如果服务器不喜欢凭据,则需要返回“WWW-Authenticate”。在我的情况下,是我们的服务器只有在缺少“Authorization”头时才会发送“WWW-Authenticate”。为了修复主题中的错误,我们在服务器端进行了更改,以便在授权失败时发送“WWW-Authenticate”。 - katit

4

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

WWW-Authenticate: None

2
请注意,有两种身份验证方法:HTTP身份验证基于令牌的身份验证。如果您使用HTTP身份验证,则必须遵循参考规范:在服务器端包含WWW-Authenticate标头字段,在本地使用java.net.Authenticator等。如果您使用基于令牌的身份验证,则显然必须使用cookie存储令牌并使其能够保持长时间的会话活动。在这种情况下,请将下面的代码放入android.app.Application.onCreate()中。
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);

如果服务器没有发送WWW-Authenticate头字段,那么当您收到HTTP 401时,就不会出现麻烦。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接