Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会更加深入。

一、简介

HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。

下载地址: http://hc.apache.org/downloads.cgi

二、特性

1. 基于标准、纯净的java语言。实现了Http1.0和Http1.1

2. 以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。

3. 支持HTTPS协议。

4. 通过Http代理建立透明的连接。

5. 利用CONNECT方法通过Http代理建立隧道的https连接。

6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。

7. 插件式的自定义认证方案。

8. 便携可靠的套接字工厂使它更容易的使用第三方解决方案。

9. 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。

10. 自动处理Set-Cookie中的Cookie。

11. 插件式的自定义Cookie策略。

12. Request的输出流可以避免流中内容直接缓冲到socket服务器。

13. Response的输入流可以有效的从socket服务器直接读取相应内容。

14. 在http1.0和http1.1中利用KeepAlive保持持久连接。

15. 直接获取服务器发送的response code和 headers。

16. 设置连接超时的能力。

17. 实验性的支持http1.1 response caching。

18. 源代码基于Apache License 可免费获取。

三、使用方法

使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。

1. 创建HttpClient对象。

2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。

3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。

4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。

5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

6. 释放连接。无论执行方法是否成功,都必须释放连接

四、实例

  1. package com.test;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.UnsupportedEncodingException;
  6. import java.security.KeyManagementException;
  7. import java.security.KeyStore;
  8. import java.security.KeyStoreException;
  9. import java.security.NoSuchAlgorithmException;
  10. import java.security.cert.CertificateException;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. import javax.net.ssl.SSLContext;
  14. import org.apache.http.HttpEntity;
  15. import org.apache.http.NameValuePair;
  16. import org.apache.http.ParseException;
  17. import org.apache.http.client.ClientProtocolException;
  18. import org.apache.http.client.entity.UrlEncodedFormEntity;
  19. import org.apache.http.client.methods.CloseableHttpResponse;
  20. import org.apache.http.client.methods.HttpGet;
  21. import org.apache.http.client.methods.HttpPost;
  22. import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
  23. import org.apache.http.conn.ssl.SSLContexts;
  24. import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
  25. import org.apache.http.entity.ContentType;
  26. import org.apache.http.entity.mime.MultipartEntityBuilder;
  27. import org.apache.http.entity.mime.content.FileBody;
  28. import org.apache.http.entity.mime.content.StringBody;
  29. import org.apache.http.impl.client.CloseableHttpClient;
  30. import org.apache.http.impl.client.HttpClients;
  31. import org.apache.http.message.BasicNameValuePair;
  32. import org.apache.http.util.EntityUtils;
  33. import org.junit.Test;
  34. public class HttpClientTest {
  35. @Test
  36. public void jUnitTest() {
  37. get();
  38. }
  39. /**
  40. * HttpClient连接SSL
  41. */
  42. public void ssl() {
  43. CloseableHttpClient httpclient = null;
  44. try {
  45. KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
  46. FileInputStream instream = new FileInputStream(new File("d:\\tomcat.keystore"));
  47. try {
  48. // 加载keyStore d:\\tomcat.keystore
  49. trustStore.load(instream, "123456".toCharArray());
  50. } catch (CertificateException e) {
  51. e.printStackTrace();
  52. } finally {
  53. try {
  54. instream.close();
  55. } catch (Exception ignore) {
  56. }
  57. }
  58. // 相信自己的CA和所有自签名的证书
  59. SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build();
  60. // 只允许使用TLSv1协议
  61. SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,
  62. SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
  63. httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
  64. // 创建http请求(get方式)
  65. HttpGet httpget = new HttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action");
  66. System.out.println("executing request" + httpget.getRequestLine());
  67. CloseableHttpResponse response = httpclient.execute(httpget);
  68. try {
  69. HttpEntity entity = response.getEntity();
  70. System.out.println("----------------------------------------");
  71. System.out.println(response.getStatusLine());
  72. if (entity != null) {
  73. System.out.println("Response content length: " + entity.getContentLength());
  74. System.out.println(EntityUtils.toString(entity));
  75. EntityUtils.consume(entity);
  76. }
  77. } finally {
  78. response.close();
  79. }
  80. } catch (ParseException e) {
  81. e.printStackTrace();
  82. } catch (IOException e) {
  83. e.printStackTrace();
  84. } catch (KeyManagementException e) {
  85. e.printStackTrace();
  86. } catch (NoSuchAlgorithmException e) {
  87. e.printStackTrace();
  88. } catch (KeyStoreException e) {
  89. e.printStackTrace();
  90. } finally {
  91. if (httpclient != null) {
  92. try {
  93. httpclient.close();
  94. } catch (IOException e) {
  95. e.printStackTrace();
  96. }
  97. }
  98. }
  99. }
  100. /**
  101. * post方式提交表单(模拟用户登录请求)
  102. */
  103. public void postForm() {
  104. // 创建默认的httpClient实例.
  105. CloseableHttpClient httpclient = HttpClients.createDefault();
  106. // 创建httppost
  107. HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action");
  108. // 创建参数队列
  109. List<namevaluepair> formparams = new ArrayList<namevaluepair>();
  110. formparams.add(new BasicNameValuePair("username", "admin"));
  111. formparams.add(new BasicNameValuePair("password", "123456"));
  112. UrlEncodedFormEntity uefEntity;
  113. try {
  114. uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");
  115. httppost.setEntity(uefEntity);
  116. System.out.println("executing request " + httppost.getURI());
  117. CloseableHttpResponse response = httpclient.execute(httppost);
  118. try {
  119. HttpEntity entity = response.getEntity();
  120. if (entity != null) {
  121. System.out.println("--------------------------------------");
  122. System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8"));
  123. System.out.println("--------------------------------------");
  124. }
  125. } finally {
  126. response.close();
  127. }
  128. } catch (ClientProtocolException e) {
  129. e.printStackTrace();
  130. } catch (UnsupportedEncodingException e1) {
  131. e1.printStackTrace();
  132. } catch (IOException e) {
  133. e.printStackTrace();
  134. } finally {
  135. // 关闭连接,释放资源
  136. try {
  137. httpclient.close();
  138. } catch (IOException e) {
  139. e.printStackTrace();
  140. }
  141. }
  142. }
  143. /**
  144. * 发送 post请求访问本地应用并根据传递参数不同返回不同结果
  145. */
  146. public void post() {
  147. // 创建默认的httpClient实例.
  148. CloseableHttpClient httpclient = HttpClients.createDefault();
  149. // 创建httppost
  150. HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action");
  151. // 创建参数队列
  152. List<namevaluepair> formparams = new ArrayList<namevaluepair>();
  153. formparams.add(new BasicNameValuePair("type", "house"));
  154. UrlEncodedFormEntity uefEntity;
  155. try {
  156. uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");
  157. httppost.setEntity(uefEntity);
  158. System.out.println("executing request " + httppost.getURI());
  159. CloseableHttpResponse response = httpclient.execute(httppost);
  160. try {
  161. HttpEntity entity = response.getEntity();
  162. if (entity != null) {
  163. System.out.println("--------------------------------------");
  164. System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8"));
  165. System.out.println("--------------------------------------");
  166. }
  167. } finally {
  168. response.close();
  169. }
  170. } catch (ClientProtocolException e) {
  171. e.printStackTrace();
  172. } catch (UnsupportedEncodingException e1) {
  173. e1.printStackTrace();
  174. } catch (IOException e) {
  175. e.printStackTrace();
  176. } finally {
  177. // 关闭连接,释放资源
  178. try {
  179. httpclient.close();
  180. } catch (IOException e) {
  181. e.printStackTrace();
  182. }
  183. }
  184. }
  185. /**
  186. * 发送 get请求
  187. */
  188. public void get() {
  189. CloseableHttpClient httpclient = HttpClients.createDefault();
  190. try {
  191. // 创建httpget.
  192. HttpGet httpget = new HttpGet("http://www.baidu.com/");
  193. System.out.println("executing request " + httpget.getURI());
  194. // 执行get请求.
  195. CloseableHttpResponse response = httpclient.execute(httpget);
  196. try {
  197. // 获取响应实体
  198. HttpEntity entity = response.getEntity();
  199. System.out.println("--------------------------------------");
  200. // 打印响应状态
  201. System.out.println(response.getStatusLine());
  202. if (entity != null) {
  203. // 打印响应内容长度
  204. System.out.println("Response content length: " + entity.getContentLength());
  205. // 打印响应内容
  206. System.out.println("Response content: " + EntityUtils.toString(entity));
  207. }
  208. System.out.println("------------------------------------");
  209. } finally {
  210. response.close();
  211. }
  212. } catch (ClientProtocolException e) {
  213. e.printStackTrace();
  214. } catch (ParseException e) {
  215. e.printStackTrace();
  216. } catch (IOException e) {
  217. e.printStackTrace();
  218. } finally {
  219. // 关闭连接,释放资源
  220. try {
  221. httpclient.close();
  222. } catch (IOException e) {
  223. e.printStackTrace();
  224. }
  225. }
  226. }
  227. /**
  228. * 上传文件
  229. */
  230. public void upload() {
  231. CloseableHttpClient httpclient = HttpClients.createDefault();
  232. try {
  233. HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceFile.action");
  234. FileBody bin = new FileBody(new File("F:\\image\\sendpix0.jpg"));
  235. StringBody comment = new StringBody("A binary file of some kind", ContentType.TEXT_PLAIN);
  236. HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("bin", bin).addPart("comment", comment).build();
  237. httppost.setEntity(reqEntity);
  238. System.out.println("executing request " + httppost.getRequestLine());
  239. CloseableHttpResponse response = httpclient.execute(httppost);
  240. try {
  241. System.out.println("----------------------------------------");
  242. System.out.println(response.getStatusLine());
  243. HttpEntity resEntity = response.getEntity();
  244. if (resEntity != null) {
  245. System.out.println("Response content length: " + resEntity.getContentLength());
  246. }
  247. EntityUtils.consume(resEntity);
  248. } finally {
  249. response.close();
  250. }
  251. } catch (ClientProtocolException e) {
  252. e.printStackTrace();
  253. } catch (IOException e) {
  254. e.printStackTrace();
  255. } finally {
  256. try {
  257. httpclient.close();
  258. } catch (IOException e) {
  259. e.printStackTrace();
  260. }
  261. }
  262. }
  263. }

httpsClient的更多相关文章

  1. httpsClient实例

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...

  2. httpsclient 自动获取证书 无证书访问 验证过能直接用

    首先实现写一个 实现接口SecureProtocolSocketFactory的类. /** *ClassName: bcde *date: 2015年2月26日 下午4:51:01 * *@auth ...

  3. Libcurl的编译_HTTP/HTTPSclient源代码演示样例

    HTTP/HTTPSclient源代码演示样例 环境:  zlib-1.2.8  openssl-1.0.1g  curl-7.36 Author:  Kagula LastUpdateDate: 2 ...

  4. httpsClient抓取证书

    在执行webservice的过程中,出现如下异常: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorExcep ...

  5. 【tomcat】HTTPS访问配置 + restful调用远程HTTPS绕过验证

     单向验证: 第一步: 生成key: keytool -genkey -alias mykey -keyalg RSA -keystore d:/key/testkey keytool -export ...

  6. SSL handshake alert: unrecognized_name error since upgrade to Java 1.7

    今天将jdk从1.6升级到1.7,但是HttpUrlConnection连接https出现问题了. javax.net.ssl.SSLProtocolException: handshake aler ...

  7. handshake_failure

    在java 1.6版本中,通过HttpsURLConnection请求class 1(多发生于免费ssl证书,比如沃通或者startssl的)的https网络地址时,可能会报握手异常: Caused ...

  8. cas 单点登录出现org.jasig.cas.client.util.CommonUtils.getResponseFromServer - 拒绝连接 Connection refused

    cas 单点登录出现org.jasig.cas.client.util.CommonUtils.getResponseFromServer - 拒绝连接 Connection refused 环境: ...

  9. java.net.SocketException: No buffer space available

    https 访问url在调用量不大的情况下 java.net.SocketException: No buffer space available (maximum connections reach ...

随机推荐

  1. OpenStack 控制台不能不能访问的问题

    经过一个多月断断续续的OpenStack部署,今天终于搞定基本的云环境部署,linux.Windows虚拟机都可以正常运行!虽然期间遇到了N多的坑,在自己不断学习,不断找E文的过程中都逐一被我攻破,但 ...

  2. Spring IoC容器的设计—2—主线

    第二条接口设计主线是,以ApplicationContext应用上下文接口为核心的接口设计,这里涉及的主要接口设计有,从BeanFactory到ListableBeanFactory,再到Applic ...

  3. 7款值得你心动的HTML5动画和游戏

    1.HTML5 Canvas粒子效果文字动画特效 之前我们分享过很多超酷的文字特效,其中也有利用HTML5和CSS3的.今天我们要来分享一款基于HTML5 Canvas的文字特效,输入框中输入想要展示 ...

  4. java中Map,List与Set的区别

    Set,List,Map的区别 java集合的主要分为三种类型: Set(集) List(列表) Map(映射) 要深入理解集合首先要了解下我们熟悉的数组: 数组是大小固定的,并且同一个数组只能存放类 ...

  5. 杭电ACM2085--核反应堆

    http://acm.hdu.edu.cn/showproblem.php?pid=2085 这也是一个简单的的递推. a[i][0] = 3*a[i-1][0]+2*a[i-1][1]; a[i][ ...

  6. UML类图新手入门级介绍

    UML类图新手入门级介绍 举一个简单的例子,来看这样一副图,其中就包括了UML类图中的基本图示法. 首先,看动物矩形框,它代表一个类(Class).类图分三层,第一层显示类的名称,如果是抽象类,则就用 ...

  7. windowsphone 瀑布流&ui虚拟化

    瀑布流已经有点年代了吧,不过wp上还真是挺少资料的.今天抽空把自己之前搞过的东西写出来,避免大家重复劳动. 一.简单的瀑布流排版加入ui虚拟化. 最近看了 段博琼  ui虚拟化的一篇博文,链接:htt ...

  8. NDK 通过java调用so文件

    首先我们来看so文件的来源 1. 自己写.c文件,然后生成so库 2. 引用别人的静态库,或者动态库来生成新的jni调用库. 我们先来看最简单的编写一个jni调用的so库,包含一个获取字符串的方法,通 ...

  9. mysql 基础知识

    Mysql 远程登录及常用命令 第一招.mysql服务的启动和停止 net stop mysql net start mysql 第二招.登陆mysql 语法如下: mysql -u用户名 -p用户密 ...

  10. ADO.NET笔记——调用存储过程

    相关知识: 在ADO.NET访问SQL Server时,鼓励使用存储过程取代常规的SQL语句. 存储过程有下列优点: 存储过程中的SQL语句将会经过预先的解析和编译,然后存放在数据库服务器上行.调用的 ...