【问题标题】:Authentication Error when using HttpPost with DefaultHttpClient on Android在 Android 上将 HttpPost 与 DefaultHttpClient 一起使用时的身份验证错误
【发布时间】:2011-05-24 17:32:32
【问题描述】:

我在使用 HttpClient 时遇到了一个奇怪的问题。我将 DefaultHttpClient() 与 HttpPost 一起使用。我使用 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 执行相同的调用(但显然将参数更改为 API 参数)时,我收到以下错误:

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

我请求的页面是 HTTPS 页面,这可能是问题吗?

但是对 API 上的原始 HTTP 页面执行相同类型的 POST 请求会产生相同的错误,除非我注释掉 StringEntity 部分然后它运行(但返回 xml 并且我想传递一个参数来请求数据JSON 格式)。

这似乎是一个非常奇怪的问题(非 https 部分),但在这个问题上真的找不到任何帮助,如果有答案,很抱歉。

有什么想法吗?

提前致谢,

无限

编辑:好的,我无处可去,所以我想如果我将您定向到 API,它可能会有所启发,它是 8Tracks API,正如您所看到的,您需要为所有请求传递一个开发密钥 (api_key)我坚持的部分是使用 https 登录用户:http://www.8tracks.com/sessions.xml" 部分。

希望这会有所帮助,因为我处于死胡同。

谢谢,

无限化

【问题讨论】:

  • 您的网址不应该以 https 开头。然后,如果它是 https,它可能会使用证书或其他一些身份验证挑战来保护 - 如错误消息中所示。
  • 我只是把那个网址作为一个例子,但它应该。但是正如我所说,我尝试 HttpPost 我自己的脚本很好,如果我尝试 HttpPost api 的非 https 部分,如在他们的示例中调用的 http 页面而不是 https,我只会在传递 nameValuePairs 时收到错误,如果我不这样做,我就不会收到身份验证错误。
  • 你能告诉我们你的HttpClient构造函数吗?
  • 只是HttpClient httpClient = new DefaultHttpClient();但我尝试使用此处的代码为 SSL 设置它:thinkandroid.wordpress.com/2009/12/31/… 但我仍然遇到同样的错误。

标签: android https httpclient http-post http-get


【解决方案1】:

身份验证错误:无法 应对以下任何挑战:{}

此错误消息表示服务器以401 (Unauthorized) 状态码响应,但未能提供单个身份验证挑战(WWW-Authenticate 标头),因此 HttpClient 无法自动从身份验证失败中恢复。

最有可能的应用程序需要一些包含在 HTTP POST 请求中的 HTML 表单中的软凭证。

【讨论】:

    【解决方案2】:

    你不需要声明端口和协议吗?我只是在摆弄这段代码,所以如果它没有立即正确编译,请不要生气。另外,我通常会为我的 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 的更多信息。

    【讨论】:

    • 嗯,好吧,我试试,我只是很困惑,因为使用 HttpGet 它工作得很好(非 https 的东西),然后突然它在我使用 HttpPost 时谈论身份验证。谢谢,不过我会试试看。
    • 嗯,这似乎也不起作用,但感谢您的尝试。我想我会联系 API 作者,看看他们的建议。谢谢。
    • 很抱歉听到这个消息。我看到您发布的 API 显然显示支持 https,所以我不知道该说什么。我构建了一个 Java 库,它允许用户通过 http 或 https 连接到 CouchDB 数据库,这使用了许多相同的概念。如果有帮助,你可以戳戳here
    【解决方案3】:

    这是我遇到类似问题的方式:

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

    感谢 Ryan 的正确指导。

    【讨论】:

      【解决方案4】:

      没有为我的 Twitter 应用指定 回调 URL 导致我出现同样的错误:

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

      在 Twitter 上设置回调 URL 解决了问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-08
        • 1970-01-01
        • 1970-01-01
        • 2013-02-10
        • 2020-03-12
        • 2018-05-15
        • 2011-11-25
        • 2017-05-10
        相关资源
        最近更新 更多