2013-12-16 79 views
11

我正在嘗試使用一些遺留代碼,並且在使用抽球時遇到了問題。android - volley error沒有發現身份驗證挑戰

我想獲得一個API,我們的主要網站有,它可以正常工作的一個帳戶,但不是另一個。我試圖找出請求URL /頭文件中的差異,以及回覆中的內容,但我似乎無法在抽象代碼中找到將這些內容打印到日誌中的方法。

我得到的錯誤是

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

我讀過左右,這可能是由於401響應,但我真的不知道這意味着什麼,或者至少如何證明/測試一下。我真的很困惑,它適用於一個帳戶,而不是另一個帳戶。

網址與我們的英國網站和其他AM網站略有不同,但除此之外沒有區別。

感謝

+0

這是一個錯誤,指示執行排氣請求時不能建立連接。 – Raghunandan

+0

@Raghunandan你知道是否有獲得更多的信息嗎?任何回覆細節等? –

+0

無法建立連接。如果沒有連接,那麼有機會獲得迴應 – Raghunandan

回答

8

這個錯誤是因爲服務器發送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

很抱歉,我很久以前問過這個問題,我甚至都不記得它與什麼有關,加上遺留項目已經關閉。我會爲你付出的努力大加讚賞,但是沒有辦法檢查它是否正確,所以不會選擇它作爲我害怕的答案。 –

8

的確,我通過在服務器響應中包含WWW-Authenticate標題解決了這個問題。

但是,如果添加標頭WWW-Authenticate: Basic realm=""並且您的API也被Web客戶端佔用,則某些Web瀏覽器將觸發彈出窗口詢問基本憑據。

對我來說,正確的解決方案一直使用自定義方案。正如在blog post中所解釋的,我在標題響應中使用xBasic而不是Basic

WWW-Authenticate: xBasic realm=""

有了這個頭,不僅凌空正確解析響應,但我也避免Web瀏覽器顯示的驗證彈出。

+0

對不起很久以前問過這個問題,我甚至都不記得它與什麼有關,加上遺留項目已經關閉。我會爲你付出的努力大加讚賞,但是沒有辦法檢查它是否正確,所以不會選擇它作爲我害怕的答案。 –

+0

@勞斯沒問題!只是想幫助其他人尋找答案:) –

+0

只是一個注意陪伴這一點。你可以爲該方案使用任何字符串(例如上面的'xBasic'),但是也必須包含'realm =「」'(包括引號)以避免拋出異常。 –

0

我能夠趕上初始化請求隊列凌空當這個客戶端:

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

如果服務器崩潰,您可能會遇到這個問題。 步驟:

  1. 停止Tomcat服務器

  2. 轉到運行 - >服務 - >重新啓動數據庫(例如:Postgres的)

  3. 啓動Tomcat服務器。

0

您可以檢查e是instanceof AuthFailureError。

Log.e(TAG, "AuthFailureError: " + (e instanceof AuthFailureError)); 
相關問題