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>

HttpClient 简介与使用的更多相关文章

  1. HttpClient简介 post get -转自ibm

    HttpClient简介 HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 JDK 的 jav ...

  2. HttpClient简介与案例分析

    HttpClient简介 HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 JDK 的 jav ...

  3. [HttpClient]HttpClient简介

    1. 前言 HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java应用程序需要直接通过 HTTP 协议来访问网路资源.虽然在 JDK 的 java net包中已 ...

  4. 测试框架httpclent 1.HttpClient简介及第一个demo

    httpclient就是一个模拟 发送http请求的一个工具. 首先在pom.xml文件里面添加工具类 <dependencies> <dependency> <grou ...

  5. HttpClient简介

    栏目:Web开发 作者:admin 日期:2015-05-02 评论:0 点击: 204 次   虽然在JDK的java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说 ...

  6. HttpClient 与 HtmlParser 简介 转载

    转载地址:https://www.ibm.com/developerworks/cn/opensource/os-cn-crawler/ 本小结简单的介绍一下 HttpClinet 和 HtmlPar ...

  7. HttpClient相关

    HTTPClient的主页是http://jakarta.apache.org/commons/httpclient/,你可以在这里得到关于HttpClient更加详细的信息 HttpClient入门 ...

  8. HttpClient学习整理

    HttpClient简介HttpClient 功能介绍    1. 读取网页(HTTP/HTTPS)内容    2.使用POST方式提交数据(httpClient3)    3. 处理页面重定向    ...

  9. Web API WinForm使用HttpClient呼叫Web API

    前言 之前几篇文章已经介绍了 Web 与 Web API 的使用方式,接下来将介绍如何在 Windows Form 呼叫 Web API 的方法,要在 WinForm 中使用 Web API 的话,除 ...

随机推荐

  1. python之质数

    质数(prime number)又称素数,有无限个 质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数. 示例: num=[]; i=2 for i in range(2,100): j= ...

  2. PHP 对象基础知识

    最近开始重新学习对象知识,其实也算是初步深入学习对象和设计模式,希望自己会坚持下去,保持更新 初识PHP对象 还记得,刚开始学习 PHP 的时候,学到到方法和对象时有一个很大的疑问,对象与方法相比较那 ...

  3. stark组件前戏(2)之单例模式

    单,一个. 例,实例.对象. 通过利用Python模块导入的特性:在Python中,如果已经导入过的文件再被重新导入时候,python不会重新解释一遍,而是选择从内容中直接将原来导入的值拿来用.   ...

  4. 矩阵乘法在hadoop的实现

    先随机生成一个矩阵,矩阵的行数与列数由用户输入: #!/bin/bashfor i in `seq 1 $1`do for j in `seq 1 $2` do s=$((RANDOM%100)) e ...

  5. 初识java,编写hello world语句

    JDK: Java Develpment Kit - java开发工具包 JRE: Java Runtime Environment - java运行环境 JVM: Java Virtual Mach ...

  6. TCP/IP网络编程之I/O复用

    基于I/O复用的服务端 在前面章节的学习中,我们看到了当有新的客户端请求时,服务端进程会创建一个子进程,用于处理和客户端的连接和处理客户端的请求.这是一种并发处理客户端请求的方案,但并不是一个很好的方 ...

  7. 【01】《html5权威指南》(扫描版)(全)

    [01]<html5权威指南>(扫描版)(全) []魔芋:无高清电子书.   只看第五部分,高级功能. 作者:(美)弗里曼 著,谢延晟,牛化成,刘美英 译 [美]adam freeman ...

  8. NodeJs初学者经典入门解析

    Node.js 是一个基于谷歌浏览器JavaScript执行环境建立的一个平台,让JavaScript可以脱离客户端浏览器运行,让 JavaScript具有服务器语言的能力.我们可以使用NodeJs方 ...

  9. 【Python】locust框架接口性能测试(一)

    本人工作中主要对接口与web进行性能测试,而接口测试主要为http协议接口和webservice接口,本文主要对locust框架http接口测试先进行简单介绍. 1.测试需求 对某系统登录接口进行测试 ...

  10. 基于web自动化测试框架的设计与开发(讲解演示PPT)