IOException:“接收到的身份validation请求为空”(Apache Harmony / Android)

我想通过Android的HttpURLConnection(这是一个org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection)发送一个GET,并在收到响应后,抛出一个IOException:

在doRequestInternal()中:“接收到的authentication质询为空”

这个错误是什么意思,是什么造成的? 我正在给授权标题写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 

我find了原因。

首先,所有谁不知道这个错误意味着什么(我当然不是):如果服务器回复一个401,则抛出此exception。非常直观,考虑到它是在getResponseCode()(你永远无法检查自己的401,但必须赶上这个IOException,而不是…)。

401的真正原因是我没有发送一个OAuthvalidation器代码,在这一点上它是预期的。

也许会对某人有用…

这个exception只是意味着格式错误的回答头:没有find“WWW-Authenticate”头。 此外,用401代码分块的答案不被支持,所以你需要“Content-Length”标题(可以是零)。

只要将这个头添加到请求(在服务器端):

 WWW-Authenticate: None 

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

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

在没有WWW-Authenticate头字段的情况下从服务器收到HTTP 401时,您将不会遇到麻烦。