注意: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里步骤不同,使用的时候注意即可。