2011-05-24 84 views
12

我遇到了一個使用HttpClient的奇怪問題。我正在使用HttpPost的DefaultHttpClient()。我以100%的成功使用HttpGet,但現在試圖切換到HttpPost,因爲我使用的REST API需要POST參數而不是GET。 (只有一些API調用,所以我知道GET調用工作正常,所以它不是API的錯誤)。在Android上使用HttpPost和DefaultHttpClient時的身份驗證錯誤

而且,我嘗試使用HttpPost上一個簡單的PHP腳本,我寫了尋找一個POST參數「變種」,又呼應它來篩選,通過這個參數如下工作得很好:

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

    postMethod = new HttpPost("http://www.examplewebsite.com"); 

    nameValuePairs.add(new BasicNameValuePair("var", "lol")); 

    try { 
     postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

     response = httpClient.execute(postMethod, responseHandler); 
     Log.i("RESTMethod", response); 
... 

的問題當我試圖做同樣的調用API(但與PARAMS改爲API PARAMS明顯)我得到以下錯誤:

Authentication error: Unable to respond to any of these challenges: {} 

我請求的頁面是HTTPS頁面,這會是問題?

但是,對API上的原始HTTP頁面執行相同類型的POST請求會給出相同的錯誤,除非我將StringEntity部分註釋掉然後運行(但是返回xml並且我想傳遞一個參數來請求數據在JSON中)。

這似乎是一個非常奇怪的問題(非HTTPS部分),但無法真正找到任何幫助這個問題,所以很抱歉,如果答案是在那裏。

任何想法?

由於提前,

Infinitifzz

編輯:好的,我也無濟於事,所以我想,如果我針對你可能一些啓發的API,它是8Tracks API,正如你可以看到你需要爲所有請求傳遞一個開發密鑰(api_key),並且我堅持使用的是使用https登錄用戶:http://www.8tracks.com/sessions.xml「部分。

希望這有助於某種方式,因爲我處於死路一條。

個謝謝,

Infinitifizz

+0

應該不是你的網址開頭是https作爲一個開始。然後,如果它是https,則可能會通過證書或其他身份驗證質詢進行保護 - 如錯誤消息中所示。 – 2011-05-24 18:06:26

+0

我只是把這個URL作爲例子,但是它應該。但正如我所說,我試圖HttpPost我自己的腳本,這是很好,如果我試圖HttpPost一個非https部分的API作爲在他們的示例調用一個HTTP頁面不是HTTPS,我只有錯誤,如果我通過nameValuePair ,如果我沒有,我沒有得到認證錯誤。 – 2011-05-24 18:25:44

+0

你能告訴我們你的HttpClient構造函數嗎? – Ryan 2011-05-24 18:27:17

回答

3

你沒有申報的端口和協議?我只是誇大這個代碼,所以如果它不能立即編譯,請不要不高興。另外,我通常會向我的setCredentials()提供一個UsernamePasswordCredentials,但我想它是一樣的。

HttpHost host = new HttpHost("www.foo.com", 443, "https"); 

// assemble your GET or POST 

client.getCredentialsProvider().setCredentials(new AuthScope(host.getHostName(), host.getPort())); 

HttpResponse response = client.execute(host, [HttpPost or HttpGet]); 

更多關於setCredentials的信息here

+0

嗯好吧我會去,我只是主要因爲使用HttpGet它工作正常(非HTTPS)而困惑,然後突然它談論身份驗證時,我使用HttpPost。謝謝,我會試一試。 – 2011-05-24 19:27:29

+0

很酷,讓我知道。 – Ryan 2011-05-24 19:45:28

+0

嗯,似乎不工作,但謝謝你的嘗試。我想我會聯繫API的作者,看看他們的建議。謝謝anwyay。 – 2011-05-28 17:59:00

11

Authentication error: Unable to respond to any of these challenges: {}

此錯誤消息意味着服務器與401 (Unauthorized)狀態代碼響應,但未能提供單個AUTH挑戰(WWW-Authenticate頭),從而使它不可能爲了HttpClient的自動從認證失敗中恢復。

最有可能的應用程序需要HTTP POST請求中包含的HTML表單中的某些軟憑據。

3

這是我怎麼會出現類似的問題:

DefaultHttpClient client = new DefaultHttpClient(); 
client.getCredentialsProvider().setCredentials(AuthScope.ANY, 
      new UsernamePasswordCredentials(username, password)); 

感謝瑞安正確的方向。

+0

不適合我( – 2014-01-21 08:00:51

1

不指定回調URL我的Twitter的應用程序導致了同樣的錯誤我:

Authentication error: Unable to respond to any of these challenges: {oauth=WWW-Authenticate: OAuth realm="https://api.twitter.com"} 

在Twitter上設置一個回調URL解決了這一問題