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. }</namevaluepair></namevaluepair></namevaluepair></namevaluepair>

本实例是采用HttpClient4.3最新版本。该版本与之前的代码写法风格相差较大,大家多留意下。

接口测试之HttpClient的更多相关文章

  1. HttpClient接口测试之会话保持

    HttpClient接口测试之会话保持     HttpClient4.X自带会话保持功能,使用同一个HttpClient未关闭的连接即可保持登陆会话,如果多个HttpClient想要使用一个登陆会话 ...

  2. SoapUI接口测试之实战运用操作(五)

    SoapUI接口测试之实战运用操作(五)

  3. WebAPI接口测试之matthewcv.WebApiTestClient

    WebAPI接口测试之matthewcv.WebApiTestClient matthewcv.WebApiTestClient 1.安装matthewcv.WebApiTestClient包 打开v ...

  4. 老李分享:接口测试之jmeter

    老李分享:接口测试之jmeter   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.移动端自动化测试很多人把他仅仅理解成appu ...

  5. SoapUI SoapUI接口测试之编码设置

    SoapUI接口测试之编码设置 by:授客 QQ:1033553122 问题描述: 实际测试过程中发现,SoapUI提交后的数据,在数据库中查看数据值存储,发现是乱码,如下图: 查找原因,show c ...

  6. SoapUI 接口测试之post提交本地数据文件

    SoapUI接口测试之post提交本地数据文件 by:授客 QQ:1033553122 本文主要是针对用SoapUI POST提交本地数据文件的方法做个简单介绍 举例: 文件同步接口 接口地址:htt ...

  7. API Test Postman接口测试之高级篇2

    API Test  Postman接口测试之高级篇2 一.继承父类的设置: 二.导出及导入: 三.分享文档: 四.发布接口文档: 五.常用脚本: 右边框选的是一些常用的脚本,postman提供的,可以 ...

  8. API Test Postman接口测试之高级篇1

    API Test  Postman接口测试之高级篇1 一.postman中的请求参数简介: 1.请求参数简介: 点击params下面会出现key,value等信息,这里填写的会自动追加在url地址后面 ...

  9. python接口测试之mock(二)

    上一篇对mock-server已经做了初步的介绍,今天这里继续接着之前的介绍进行,我们先看之前的mock-server部分,之前编写了一个登录的mock,具体json文件见如下的内容: 小王子1110 ...

随机推荐

  1. List相关知识点.......课堂加整理

    package lis0924; //接口List(列表) import java.util.ArrayList; import java.util.Iterator; import java.uti ...

  2. 行业集中度(Concentration Ratio)

    行业集中度是决定市场结构最基本.最重要的因素,集中体现了市场的竞争和垄断程度,经常使用的集中度计量指标有:行业集中率(CRn指数).赫尔芬达尔—赫希曼指数(Herfindahl-HirschmanIn ...

  3. 网络性能测试工具iperf详细使用图文教程

      Iperf是一个网络性能测试工具.Iperf可以测试TCP和UDP带宽质量.Iperf可以测量最大TCP带宽,具有多种参数和UDP特性. Iperf可以报告带宽,延迟抖动和数据包丢失.利用Iper ...

  4. javascript对象的一点理解

    <script type="text/javascript"> /* js对象:对象的职责是调用属性和调用方法 */ //1.对象的创建的三种方式 var obj = ...

  5. 整数与IP地址间的转换

    描述 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个长整数.举例:一个ip地址为10.0.3.193每段数字            ...

  6. 大数相乘nyoj28

    描述我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?   输入 输入一个整数m(0<m<=5000) 输出 输出m的阶乘,并在输出结束之后输入一个换行符 ...

  7. velocity.js用法整理1

    velocity.js 此框架相对于JQ的运动算法, 有很大的优势. 例如,A和B两个元素,position:absolute;  top:0; 现在让A元素用JQ的animate,B用velocit ...

  8. windows7系统下一些常用工具的总结

    1.查看计算机的基本信息:计算机--右键--属性(快捷键:Win+Pause) 2.查看计算机的详细信息:开始菜单--所有程序--附件--系统工具--系统信息(运行命令:msinfo32) 3.定制计 ...

  9. Trace文件过量生成问题解决

    查看用户临时文件(trace文件)所在位置 如果是trace文件(.trc)大导致的 SQL>show parameters user_dump_dest 在路径下查看 alert_log 文件 ...

  10. SynchronousQueue 的简单应用

    SynchronousQueue是这样一种阻塞队列,其中每个 put 必须等待一个 take,反之亦然.同步队列没有任何内部容量,甚至连一个队列的容量都没有.      不能在同步队列上进行 peek ...