【问题标题】:Apache HttpClientBuilder - IllegalArgumentExceptionApache HttpClientBuilder - IllegalArgumentException
【发布时间】:2014-11-19 06:59:13
【问题描述】:

我在尝试使用 HttpClientBuilder 构建 Apache HttpClient 实例时收到 IllegalArgumentException

private CloseableHttpClient delegate;

public DigestClient(String user, String pass) {
    Credentials credentials = new UsernamePasswordCredentials(user, pass);

    CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(AuthScope.ANY, credentials);

    delegate = HttpClientBuilder.create()
            .setDefaultCredentialsProvider(credentialsProvider)
            .build();
}

我得到的是:

 java.lang.IllegalArgumentException: Item may not be null
        at org.apache.http.util.Args.notNull(Args.java:48)
        at org.apache.http.config.RegistryBuilder.register(RegistryBuilder.java:58)
        at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:727)
        at com.example.app.data.net.DigestClient.<init>(DigestClient.java:51)

你知道为什么会这样吗?

这是我使用 HttpClient 版本的 gradle:

compile 'org.apache.httpcomponents:httpclient-android:4.3.5'

【问题讨论】:

    标签: java android httpclient apache-httpclient-4.x apache-httpcomponents


    【解决方案1】:

    升级httpclient-android 版本为我修复了它:

    compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
    

    【讨论】:

      【解决方案2】:

      我在这里找到了解决方案:

      http://javacave.blogspot.com/2014/08/androidapache-httpclient.html

      对于不懂中文的人:

      我必须这样做:

      SSLContext sslContext = SSLContexts.createSystemDefault();
      SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
      

      然后

      delegate = HttpClients.custom()
                  .setDefaultCredentialsProvider(credentialsProvider)
                  .setSSLSocketFactory(sslsf)
                  .build();
      

      至少它不会这样崩溃。

      【讨论】:

      • 感谢您提供此修复程序。 httpclient 4.3 接口问题在 Gradle 中导致了一些非常奇怪的依赖关系。必须覆盖我的 HttpClientBuilder:
        public class CustomBuilder extends HttpClientBuilder { @Override public CloseableHttpClient build() { setUserAgent(AndroidSendGridApi.USER_AGENT);使用系统属性(); setSslcontext(SSLContexts.createSystemDefault());返回 super.build(); } }
      【解决方案3】:
      private CloseableHttpClient delegate;
      
      public DigestClient(String user, String pass) {
          Credentials credentials = new UsernamePasswordCredentials(user, pass);
      
          CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
          credentialsProvider.setCredentials(AuthScope.ANY, credentials);
      
          delegate = HttpClientBuilder.create()
                  .setDefaultCredentialsProvider(credentialsProvider)
                  .build();
      }
      

      【讨论】:

      • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 2010-10-24
      • 2014-06-08
      • 2015-02-28
      • 1970-01-01
      相关资源
      最近更新 更多