我正在尝试使用一些遗留代码,并在使用凌空时遇到问题。
我正在尝试使用我们的主站点的api,它适用于一个帐户,但不适用于另一个帐户。我试图弄清楚请求网址/标题中的差异以及回复中的内容,但我似乎无法在排球代码中找到一种方法将其打印到日志。
我得到的错误是
com.android.volley.NoConnectionError: java.io.IOException: No authentication challenges found
我已经读到这可能是由于401响应,但我不知道这意味着什么,或者至少如何证明/测试它。我真的很困惑,它适用于一个帐户而不是另一个帐户。
网址略有不同,因为我们的英国网站和我们的AM是另一个,但除此之外没有区别。
由于
答案 0 :(得分:8)
发生此错误是因为服务器发送401(未授权)但未提供“WWW-Authenticate”,这是客户端下一步操作的提示。 “WWW-Authenticate”标题告诉客户端需要哪种身份验证(Basic或Digest)。这在无头http客户端中通常不是很有用,但这就是标准的定义方式。发生此错误是因为lib尝试解析“WWW-Authenticate”标头但不能解析。
如果您可以更改服务器,可能的解决方案:
WWW-Authenticate: Basic realm="fake"
。这仅仅是一种解决方法而不是解决方案,但它应该可以工作并且http客户端很满意。403
代替401
。它的语义不一样,通常在使用登录401时是正确的响应(see here for a detailed discussion),但它足够接近。如果您无法更改服务器,可能的解决方案:
正如@ErikZ在他的post中写道,你可以试试看& catch
HttpURLConnection connection = ...;
try {
// Will throw IOException if server responds with 401.
connection.getResponseCode();
} catch (IOException e) {
// Will return 401, because now connection has the correct internal state.
int responsecode = connection.getResponseCode();
}
我也在这里发布了这个:java.io.IOException : No authentication challenges found
答案 1 :(得分:8)
确实,我通过在服务器响应中包含WWW-Authenticate
标头解决了这个问题。
但是,如果您添加标头WWW-Authenticate: Basic realm=""
并且您的API也被网络客户端使用,则某些网络浏览器会触发弹出请求基本凭据。
对我来说,正确的解决方案一直在使用自定义方案。正如本blog post中所述,我在标头响应中使用xBasic
而不是Basic
。
WWW-Authenticate: xBasic realm=""
使用此标头,不仅Volley正确解析响应,而且还避免显示身份验证弹出的Web浏览器。
答案 2 :(得分:0)
初始化凌空RequestQueue时,我能够抓住这个客户端:
Volley.newRequestQueue(getApplicationContext(), new HurlStack() {
@Override
public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders) {
try {
return super.performRequest(request, additionalHeaders);
} catch (AuthFailureError authFailureError) {
authFailureError.printStackTrace();
// Log out / whatever you need to do here
} catch (IOException e) {
e.printStackTrace();
if (e.getMessage().equals("No authentication challenges found")) {
// This is the error. You probably will want to handle any IOException, not just those with the same message.
}
}
return null;
}
});
答案 3 :(得分:0)
如果服务器崩溃,您可能会遇到此问题。 步骤进行:
停止tomcat服务器
goto Run - &gt;服务 - &gt;重启你的数据库(例如:postgres)
启动tomcat服务器。
答案 4 :(得分:0)
您可以检查e是AutofFailureError的实例。
Log.e(TAG, "AuthFailureError: " + (e instanceof AuthFailureError));