我正在尝试通过Android的 HttpURLConnection
(从 org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection
导入)发送GET,并在收到回复时 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
答案 0 :(得分:50)
我找到了原因。
首先,对所有不知道这个错误意味着什么的人(我肯定不是): 如果服务器回复401,则抛出此异常。非常直观,考虑到它是在getResponseCode()中抛出的(哇,你永远不能自己检查401s,但必须反而抓住这个IOException ...)。
401的实际原因是我没有发送OAuth验证程序代码,此时此处是预期的。
答案 1 :(得分:13)
也许对某人有用......
此异常仅表示格式错误的答案标题:未找到“WWW-Authenticate”标题。 此外,不支持使用401代码的分块答案,因此您需要“Content-Length”标题(可以为零)。
答案 2 :(得分:4)
只需将此标头添加到请求中(在服务器端):
WWW-Authenticate: None
答案 3 :(得分:2)
请注意,有两种身份验证方法:HTTP Authentication和token-based authentication。如果您正在使用HTTP身份验证,则必须遵循引用的规范:在服务器端包含 WWW-Authenticate 标头字段,在本地使用java.net.Authenticator
等。如果您使用基于令牌的身份验证,那么很明显,你必须使用cookie来存储令牌,并使长寿会话保持活力。在这种情况下,将下一个代码放入android.app.Application.onCreate()
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
如果没有 WWW-Authenticate 标题字段从服务器接收HTTP 401,您将不会遇到麻烦。