星期三, 八月 27, 2014

如何在Android里使用最新的Apache Httpclient

注意:Android最早使用的Apache HttpClient 4.0-beta的一个包,后来基本
不再维护,所以如果有更多的新的HTTP 特性,基本不再支持,
而且,Android推荐大家使用系统标准的java标准包:HttpURLConnection 
但是HttpURLConnection比较底层,使用起来非常的不便,尤其是在
    类似提交Form和服务器传送数据的时候;所以最近有okHttp就封装了HttpURLConnction
给开发人员提供了较好的API.但是使用起来依然不如HttpRequest爽快.
尤其是在目前稍微严肃的应用都会基于HTTPS/SSL的基础之上,大量的验证
模式支持就是以前的4.0版本不支持的。没有现成的方案。所以使用
  最新的httpclient包是必须的了。
但是由于httpclient是基于标准JDK的,有许多牵涉到版权的API比如
misc.sun之类的包不能在Android上使用,所以这个处理工作还是比较繁琐的。
幸运的是apache提供了Android移植包:
参考,写本文时的最新版本4.3.5:
http://hc.apache.org/httpcomponents-client-4.3.x/android-port.html
  
可以在www.mvnrepository.com上 输入httpclient-android来寻找最新的
jar包Android移植版本并下载即可。
当然有些类不可避免的原始的类的功能不同并有扩展,这个时候,就要使用
类名带HC4结尾的类来使用最新的功能特性了
 
但是如果我们在Android Activity调用Async或者Thread调用最基本的:
CloseableHttpClient httpclient = HttpClients.createDefault();
立即出现异常:
 java.lang.IllegalArgumentException: Item may not be null
  
查看代码则是:
  org.apache.http.config.RegistryBuilder.java
的  Args.notNull(item, "Item");造成了错误。
阅读代码发现,这是因为SocketFactory为空造成的,所以
必须首先初始化,SocketFactory

 SSLContext sslContext = SSLContexts.createSystemDefault();
   SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
         sslContext,
         SSLConnectionSocketFactory.STRICT_HOSTNAME_VERIFIER);
 CloseableHttpClient  httpclient= HttpClientBuilder.create()
      .setSSLSocketFactory(sslsf)
      .build();

或者使用定制的方法:

 ConnectionSocketFactory plainsf = <...>  LayeredConnectionSocketFactory sslsf = <...>  Registry<ConnectionSocketFactory> r = RegistryBuilder.<ConnectionSocketFactory>create()          .register("http", plainsf)          .register("https", sslsf)          .build();    HttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(r);  HttpClients.custom()          .setConnectionManager(cm)          .build();

这个都可以从hc.apache.org对应版本的tutorial章节,看到详细的代码

注意在android使用需要在AndroidManifest.xml里加入权限:
<uses-permission android:name="android.permission.INTERNET"/>
  这个httpclient-android-4.3.5.jar在Android Studio和Eclipse ADT
里如何打包到最后的apk里步骤不同,使用的时候注意即可。