2011-05-24 37 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解决了这一问题