我使用HttpClient遇到了一个奇怪的问题。我正在使用带有HttpPost的DefaultHttpClient()。我正在使用HttpGet 100%成功,但现在尝试切换到HttpPost,因为我正在使用的REST API需要POST参数而不是GET。 (虽然只有一些API调用,所以我知道GET调用工作正常,所以这不是API的错误。)
另外,我尝试在我编写的一个简单的php脚本上使用HttpPost查找POST参数'var'并将其回显到屏幕,传递此参数如下工作正常:
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参数),我收到以下错误:
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“part。
希望这会有所帮助,因为我处于死胡同。
谢谢,
Infinitifizz
答案 0 :(得分:12)
身份验证错误:无法执行 应对任何这些挑战:{}
此错误消息表示服务器以401 (Unauthorized)
状态代码响应,但未能提供单个auth质询(WWW-Authenticate
标头),因此HttpClient无法自动从身份验证失败中恢复。 / p>
最有可能的应用程序需要HTTP POST请求中包含的HTML表单中的一些软凭据。
答案 1 :(得分:3)
您不必声明端口和协议吗?我只是摇摆这段代码,所以如果没有immediatley编译正确,请不要生气。另外,我通常会在我的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的更多信息。
答案 2 :(得分:3)
以下是我最终遇到类似问题的方法:
DefaultHttpClient client = new DefaultHttpClient();
client.getCredentialsProvider().setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(username, password));
感谢Ryan的正确方向。
答案 3 :(得分:1)
未为我的Twitter应用指定回调网址,导致我出现同样的错误:
Authentication error: Unable to respond to any of these challenges: {oauth=WWW-Authenticate: OAuth realm="https://api.twitter.com"}
在Twitter上设置回调网址修复了问题