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