【问题标题】:apache httpclient doesn't set basic authentication credentialsapache httpclient 未设置基本身份验证凭据
【发布时间】:2015-01-13 19:37:22
【问题描述】:

看看下面的代码:

DefaultHttpClient http = new DefaultHttpClient();
            http.getCredentialsProvider().setCredentials(
                        new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT), 
                        new UsernamePasswordCredentials( 
                                                Configuration.username, 
                                                Configuration.developerKey ) );

            HttpPost post = new HttpPost(strURL);
            StringEntity entity = new StringEntity( ac.toXMLString() );
            entity.setContentType("text/xml");
            post.setEntity( entity );
            org.apache.http.HttpResponse response = http.execute( post );

它不会产生错误。但是来自服务器的响应我得到“无授权标头”。使用 Wireshark 检查请求会发现确实没有设置基本身份验证。

这怎么可能?

【问题讨论】:

  • 你的其他标题设置了吗?例如,您的 Content-Type 是否设置为 text/xml?
  • 是的,除了身份验证之外,一切似乎都是正确的。

标签: java httpclient basic-authentication


【解决方案1】:

好的,默认情况下基本身份验证已关闭。但是,启用它太复杂了 (link) 。因此可以使用此代码,它工作正常:

DefaultHttpClient http = new DefaultHttpClient();
HttpPost post = new HttpPost(strURL);
UsernamePasswordCredentials creds = new UsernamePasswordCredentials(
                    Configuration.username, 
                    Configuration.developerKey);
post.addHeader( BasicScheme.authenticate(creds,"US-ASCII",false) );
StringEntity entity = new StringEntity( ac.toXMLString() );
entity.setContentType("text/xml");
post.setEntity( entity );
org.apache.http.HttpResponse response = http.execute( post );

【讨论】:

  • 你能告诉我当你打电话给ac.toXMLString()ac指的是什么吗?
  • ac 是我编写的自定义类的对象,toXMLString() 是我自己实现的方法(如toString())。结果是一个用于 http API 的 xml 字符串。由于这是 POST 的请求负载,因此可以是任意文本,并且与问题没有直接关系。
【解决方案2】:

凭据提供者的用户

HttpClient client = new DefaultHttpClient();
CredentialsProvider provider = new BasicCredentialsProvider();
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(apiUser,apiPassword);
provider.setCredentials(new AuthScope(apiHost, apiPort, AuthScope.ANY_REALM), credentials);     
HttpComponentsClientHttpRequestFactory commons = new HttpComponentsClientHttpRequestFactory(client);

【讨论】:

    猜你喜欢
    • 2011-11-12
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多