Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java IOException:“;收到的身份验证质询为空“0”;(Apache Harmony/Android)_Java_Android_Httpurlconnection - Fatal编程技术网

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

Java IOException:“;收到的身份验证质询为空“0”;(Apache Harmony/Android),java,android,httpurlconnection,Java,Android,Httpurlconnection,我正试图通过Android的HttpURLConnection(从org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection导入)发送GET,收到响应后,抛出一个IOException: 在doRequestInternal()中:“收到的身份验证质询为空” 这个错误是什么意思,是什么原因造成的?我正在将OAuth参数写入授权头,但我在其他情况下也这样做,没有问题 if (connection == n

我正试图通过Android的
HttpURLConnection
(从
org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection
导入)发送GET,收到响应后,抛出一个IOException

在doRequestInternal()中:“收到的身份验证质询为空”

这个错误是什么意思,是什么原因造成的?我正在将OAuth参数写入授权头,但我在其他情况下也这样做,没有问题

    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

我找到了原因

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


401的实际原因是我没有发送OAuth验证器代码,而这正是我所期望的。

可能对某些人有用

此异常仅表示应答头格式不正确:找不到“WWW-Authenticate”头。
此外,不支持带有401代码的分块答案,因此您需要“内容长度”标题(可以为零)。

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


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


当从服务器接收HTTP 401时,如果没有WWW Authenticate头字段,您就不会遇到问题。

嗨,Matthias,您使用的是twitter api吗?不,我遇到了这个问题,这是Signpost的DefaultOAuthProvider实现的一部分,它使用HTTPUrlConnection而不是ApacheHttpClient。您是否遵守了路标?我在android上遇到了很多麻烦。是的,我开发了它!这个问题已经有一年了,同时我添加了一个CommonHttpOAuthProvider,它不会受到这个问题的影响。i、 o.w.您现在可以在不使用任何java.net类的情况下使用Signpost,这些类在Harmony/Android中存在缺陷。我刚刚经历了这一点,并发现我的案例中的原因是手机上的系统时间延迟了两天。客户端需要发送“Authorization”标头,如果服务器不喜欢凭据,则需要发送回
WWW-Authenticate
。在我的例子中,它是我们的服务器,只有当
授权
头丢失时,它才发送
WWW-Authenticate
。为了修复主题中的错误,我们在服务器端做了一个更改,在授权失败时发送
WWW-Authenticate
。这对我来说很有用
WWW-Authenticate: None
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);