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. 解析XML格式数据

    学习解析XML格式的数据前,搭建一个简单的web服务器,在这个服务器上提供xml文本用于练习. 一.搭建Apache服务器 在Apache官网下载编译好的服务器程序,安装.对于Windows来说127 ...

  2. Cyclic Nacklace HDU - 3746 (kmp)

    Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  3. Careercup - Microsoft面试题 - 24308662

    2014-05-12 07:31 题目链接 原题: I have heard this question many times in microsoft interviews. Given two a ...

  4. Git之2分钟教程

    Git之2分钟入门 普通人:“借我1000块钱”.程序猿:“借你1024吧,凑个整”. 今天是1024,是我们程序员的节日,在此,首先祝各位程序猿以及程序媛们节日快乐~然后送出一份节日礼物,没错,就是 ...

  5. 59、佳博wifi打印机怎么配置

    1.去这里下载配置软件(注意,需要再windows下进行)http://pan.baidu.com/s/1bn1y4FX,并解压安装程序 2.连上wifi打印机的热点,比如说佳博打印机的默认为Gpri ...

  6. 【NOIP 2012】借教室

    题目 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望 ...

  7. allocator class

    当分配一大块内存时,我们通常计划在这块内存上按需构造对象,这样的我们希望将内存分配和对象构造分离.但是通常的new关键字的分配的动态空间,有时候会造成一些浪费,更致命的是“如果一个类没有默认构造函数, ...

  8. 求解Catalan数,(大数相乘,大数相除,大数相加)

    Catalan数 卡塔兰数是组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名.历史上,清代数学家明安图(1692年-1763年)在其<割圜 ...

  9. linux系统web日志分析脚本

    linux系统web日志分析这方面工具比较多,比如logwatch或awstats等使用perl语言开发,功能都非常强大.但这些软件都需要进行一些配置,很多朋友往往在技术方面没有投入太多力量,即便参照 ...

  10. 【bzoj1316】树上的询问 树的点分治+STL-set

    题目描述 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. 输入 第一行两个整数n, p分别表示点的个数和询问的个数. 接下来n-1行每行 ...