android - volley error没有发现身份验证挑战

问题描述:

我正在尝试使用一些遗留代码,并且在使用抽球时遇到了问题。android - volley error没有发现身份验证挑战

我想获得一个API,我们的主要网站有,它可以正常工作的一个帐户,但不是另一个。我试图找出请求URL /头文件中的差异,以及回复中的内容,但我似乎无法在抽象代码中找到将这些内容打印到日志中的方法。

我得到的错误是

com.android.volley.NoConnectionError: java.io.IOException: No authentication challenges found 

我读过左右,这可能是由于401响应,但我真的不知道这意味着什么,或者至少如何证明/测试一下。我真的很困惑,它适用于一个帐户,而不是另一个帐户。

网址与我们的英国网站和其他AM网站略有不同,但除此之外没有区别。

感谢

+0

这是一个错误,指示执行排气请求时不能建立连接。 – Raghunandan

+0

@Raghunandan你知道是否有获得更多的信息吗?任何回复细节等? –

+0

无法建立连接。如果没有连接,那么有机会获得回应 – Raghunandan

这个错误是因为服务器发送401(未授权),但不给予“WWW验证”,这是为客户做下一步的提示。 “WWW-Authenticate”标题告诉客户需要哪种认证(BasicDigest)。对于无头HTTP客户端来说,这通常不是很有用,但这就是标准的定义。发生此错误的原因是lib试图解析“WWW-Authenticate”标题,但不能。

可能的解决方案,如果你可以改变服务器:

  • 添加一个假的“WWW身份验证”标头,如:WWW-Authenticate: Basic realm="fake"。这仅仅是一种解决方法,不是解决方案,但它应该起作用并且http客户端很满意。
  • 使用HTTP状态代码403而不是401。它的语义是不一样的,通常当使用登录401是一个正确的答案(see here for a detailed discussion),但它足够接近。如果

可能的解决方案,你不能改变服务器:

由于@ErikZ在他post写道:你可以使用一个尝试&抓

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

+0

我想发送一个头与摘要认证,但无法弄清楚如何去做(仍然在寻找答案)。你有没有关于如何在Android-Volley中进行Digest(甚至基本)认证的示例? –

+0

基本和摘要只是把一个看起来像这样的“授权:基本QWxhZGRpbjpvcGVuIHNlc2FtZQ ==”在头文件中的头文件和更复杂的摘要 - 这不是特别排球,你只是把集头(谷歌如何做到这一点在凌空) – for3st

+0

很抱歉,我很久以前问过这个问题,我甚至都不记得它与什么有关,加上遗留项目已经关闭。我会为你付出的努力大加赞赏,但是没有办法检查它是否正确,所以不会选择它作为我害怕的答案。 –

的确,我通过在服务器响应中包含WWW-Authenticate标题解决了这个问题。

但是,如果添加标头WWW-Authenticate: Basic realm=""并且您的API也被Web客户端占用,则某些Web浏览器将触发弹出窗口询问基本凭据。

对我来说,正确的解决方案一直使用自定义方案。正如在blog post中所解释的,我在标题响应中使用xBasic而不是Basic

WWW-Authenticate: xBasic realm=""

有了这个头,不仅凌空正确解析响应,但我也避免Web浏览器显示的验证弹出。

+0

对不起很久以前问过这个问题,我甚至都不记得它与什么有关,加上遗留项目已经关闭。我会为你付出的努力大加赞赏,但是没有办法检查它是否正确,所以不会选择它作为我害怕的答案。 –

+0

@劳斯没问题!只是想帮助其他人寻找答案:) –

+0

只是一个注意陪伴这一点。你可以为该方案使用任何字符串(例如上面的'xBasic'),但是也必须包含'realm =“”'(包括引号)以避免抛出异常。 –

我能够赶上初始化请求队列凌空当这个客户端:

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; 
     } 
}); 

如果服务器崩溃,您可能会遇到这个问题。 步骤:

  1. 停止Tomcat服务器

  2. 转到运行 - >服务 - >重新启动数据库(例如:Postgres的)

  3. 启动Tomcat服务器。

您可以检查e是instanceof AuthFailureError。

Log.e(TAG, "AuthFailureError: " + (e instanceof AuthFailureError));