一、使用方法

使用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. import java.io.IOException;
  2. import java.net.URI;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.Map;
  6.  
  7. import org.apache.http.NameValuePair;
  8. import org.apache.http.client.entity.UrlEncodedFormEntity;
  9. import org.apache.http.client.methods.CloseableHttpResponse;
  10. import org.apache.http.client.methods.HttpGet;
  11. import org.apache.http.client.methods.HttpPost;
  12. import org.apache.http.client.utils.URIBuilder;
  13. import org.apache.http.entity.ContentType;
  14. import org.apache.http.entity.StringEntity;
  15. import org.apache.http.impl.client.CloseableHttpClient;
  16. import org.apache.http.impl.client.HttpClients;
  17. import org.apache.http.message.BasicNameValuePair;
  18. import org.apache.http.util.EntityUtils;
  19.  
  20.   public static String doGet(String url, Map<String, String> param) {
  21.  
  22. // 创建Httpclient对象
  23. CloseableHttpClient httpclient = HttpClients.createDefault();
  24.  
  25. String resultString = "";
  26. CloseableHttpResponse response = null;
  27. try {
  28. // 创建uri
  29. URIBuilder builder = new URIBuilder(url);
  30. if (param != null) {
  31. for (String key : param.keySet()) {
  32. builder.addParameter(key, param.get(key));
  33. }
  34. }
  35. URI uri = builder.build();
  36.  
  37. // 创建http GET请求
  38. HttpGet httpGet = new HttpGet(uri);
  39.  
  40. // 执行请求
  41. response = httpclient.execute(httpGet);
  42. // 判断返回状态是否为200
  43. if (response.getStatusLine().getStatusCode() == 200) {
  44. resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
  45. }
  46. } catch (Exception e) {
  47. e.printStackTrace();
  48. } finally {
  49. try {
  50. if (response != null) {
  51. response.close();
  52. }
  53. httpclient.close();
  54. } catch (IOException e) {
  55. e.printStackTrace();
  56. }
  57. }
  58. return resultString;
  59. }
  60.  
  61. public static String doGet(String url) {
  62. return doGet(url, null);
  63. }
  64.  
  65. public static String doPost(String url, Map<String, String> param) {
  66. // 创建Httpclient对象
  67. CloseableHttpClient httpClient = HttpClients.createDefault();
  68. CloseableHttpResponse response = null;
  69. String resultString = "";
  70. try {
  71. // 创建Http Post请求
  72. HttpPost httpPost = new HttpPost(url);
  73. // 创建参数列表
  74. if (param != null) {
  75. List<NameValuePair> paramList = new ArrayList<>();
  76. for (String key : param.keySet()) {
  77. paramList.add(new BasicNameValuePair(key, param.get(key)));
  78. }
  79. // 模拟表单
  80. UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
  81. httpPost.setEntity(entity);
  82. }
  83. // 执行http请求
  84. response = httpClient.execute(httpPost);
  85. resultString = EntityUtils.toString(response.getEntity(), "utf-8");
  86. } catch (Exception e) {
  87. e.printStackTrace();
  88. } finally {
  89. try {
  90. response.close();
  91. } catch (IOException e) {
  92. // TODO Auto-generated catch block
  93. e.printStackTrace();
  94. }
  95. }
  96.  
  97. return resultString;
  98. }
  99.  
  100. public static String doPost(String url) {
  101. return doPost(url, null);
  102. }
  103.  
  104. public static String doPostJson(String url, String json) {
  105. // 创建Httpclient对象
  106. CloseableHttpClient httpClient = HttpClients.createDefault();
  107. CloseableHttpResponse response = null;
  108. String resultString = "";
  109. try {
  110. // 创建Http Post请求
  111. HttpPost httpPost = new HttpPost(url);
  112. // 创建请求内容
  113. StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
  114. httpPost.setEntity(entity);
  115. // 执行http请求
  116. response = httpClient.execute(httpPost);
  117. resultString = EntityUtils.toString(response.getEntity(), "utf-8");
  118. } catch (Exception e) {
  119. e.printStackTrace();
  120. } finally {
  121. try {
  122. response.close();
  123. } catch (IOException e) {
  124. // TODO Auto-generated catch block
  125. e.printStackTrace();
  126. }
  127. }
  128.  
  129. return resultString;
  130. }

使用HttpClient发送请求的一般步骤
(1) 创建HttpClient对象。
(2)创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
(3) 如果需要发送请求参数,可调用HttpGet同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,可调用setEntity(HttpEntity entity)方法来设置请求参数。
(4) 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
(5) 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
(6) 释放连接。无论执行方法是否成功,都必须释放连接

代码如下:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;

public class HttpTest {

  1. protected static Logger logger = Logger.getLogger(HttpTest.class);
  2. //请求超时时间,这个时间定义了socket读数据的超时时间,也就是连接到服务器之后到从服务器获取响应数据需要等待的时间,发生超时,会抛出SocketTimeoutException异常。
  3. private static final int SOCKET_TIME_OUT = 60000;
  4. //连接超时时间,这个时间定义了通过网络与服务器建立连接的超时时间,也就是取得了连接池中的某个连接之后到接通目标url的连接等待时间。发生超时,会抛出ConnectionTimeoutException异常
  5. private static final int CONNECT_TIME_OUT = 60000;
  6.  
  7. private static List<NameValuePair> createParam(Map<String, Object> param) {
  8. //建立一个NameValuePair数组,用于存储欲传送的参数
  9. List<NameValuePair> nvps = new ArrayList <NameValuePair>();
  10. if(param != null) {
  11. for(String k : param.keySet()) {
  12. nvps.add(new BasicNameValuePair(k, param.get(k).toString()));
  13. }
  14. }
  15. return nvps;
  16. }
  17.  
  18. /**
  19. * 发送 post 请求
  20. * @param url 请求地址,如 http://www.baidu.com
  21. * @param param相关参数, 模拟form 提交
  22. * @return
  23. * @throws Exception
  24. */
  25. public static String postForAPP(String url, String sMethod, Map<String, Object> param, Map<String, Object> headers) throws Exception {
  26. //目前HttpClient最新版的实现类为CloseableHttpClient
  27. CloseableHttpClient client = HttpClients.createDefault();
  28. CloseableHttpResponse response = null;
  29. HttpEntity entity=null;
  30. try {
  31. if(param != null) {
  32. //建立Request的对象,一般用目标url来构造,Request一般配置addHeader、setEntity、setConfig
  33. HttpPost req = new HttpPost(url);
  34. entity=new UrlEncodedFormEntity(createParam(param), Consts.UTF_8);
  35. //setHeader,添加头文件
  36. Set<String> keys = headers.keySet();
  37. for (String key : keys) {
  38. req.setHeader(key, headers.get(key).toString());
  39. }
  40. //setConfig,添加配置,如设置请求超时时间,连接超时时间
  41. RequestConfig reqConfig = RequestConfig.custom().setSocketTimeout(SOCKET_TIME_OUT).setConnectTimeout(CONNECT_TIME_OUT).build();
  42. req.setConfig(reqConfig);
  43. //setEntity,添加内容
  44. req.setEntity(entity);
  45. //执行Request请求,CloseableHttpClient的execute方法返回的response都是CloseableHttpResponse类型
  46. //其常用方法有getFirstHeader(String)、getLastHeader(String)、headerIterator(String)取得某个Header name对应的迭代器、getAllHeaders()、getEntity、getStatus等
  47. response = client.execute(req);
  48. entity = response.getEntity();
  49. //用EntityUtils.toString()这个静态方法将HttpEntity转换成字符串,防止服务器返回的数据带有中文,所以在转换的时候将字符集指定成utf-8就可以了
  50. String result= EntityUtils.toString(entity, "UTF-8");
  51. logger.error("-------------------------"+result+"-------------");
  52. if(response.getStatusLine().getStatusCode()==200){
  53. logger.error(result+"-----------success------------------");
  54. return result;
  55. }else{
  56. logger.error(response.getStatusLine().getStatusCode()+"------------------fail-----------");
  57. return null;
  58. }
  59. }
  60. return null;
  61. } catch(Exception e) {
  62. logger.error("--------------------------post error: ", e);
  63. throw new Exception();
  64. }finally{
  65. //一定要记得把entity fully consume掉,否则连接池中的connection就会一直处于占用状态
  66. EntityUtils.consume(entity);
  67. logger.error("---------------------------finally-------------");
  68. System.out.println("---------------------------------------------------");
  69. }
  70. }
  71.  
  72. public static void main(String[] args) throws Exception {
  73. Map<String, Object> param=new HashMap<String, Object>();
  74. param.put("pdata", "mm");
  75. Map<String, Object> headers=new HashMap<String, Object>();
  76. headers.put("appid", "mm");
  77. postForAPP("http://localhost:8080/SpringMVC-httpclient/greeting", "aa", param, headers);
  78. }

转:HttpClient使用详解的更多相关文章

  1. HttpClient使用详解(转)

     HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户 ...

  2. HttpClient使用详解

    http://itindex.net/detail/52566-httpclient HttpClient使用详解 标签: httpclient | 发表时间:2015-01-22 12:07 | 作 ...

  3. Java进阶(三十二) HttpClient使用详解

    Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...

  4. gvoory脚本中关于HttpClient使用详解实例

    一.gvoory脚本中关于HttpClient使用详解实例 HttpClient:是一个接口 首先需要先创建一个DefaultHttpClient的实例 HttpClient httpClient=n ...

  5. HttpClient请求详解

    HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建 ...

  6. HttpClient类详解

    文章链接:https://blog.csdn.net/justry_deng/article/details/81042379 HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了 ...

  7. 转载:HttpClient使用详解

    原文地址:http://blog.csdn.net/wangpeng047/article/details/19624529 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自 ...

  8. [转]HttpClient使用详解

    Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且 ...

  9. Asp.Net MVC WebAPI的创建与前台Jquery ajax后台HttpClient调用详解

    1.什么是WebApi,它有什么用途? Web API是一个比较宽泛的概念.这里我们提到Web API特指ASP.NET MVC Web API.在新出的MVC中,增加了WebAPI,用于提供REST ...

  10. HttpClient使用详解 (一)

    Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且 ...

随机推荐

  1. win api + ffmpeg 播放 mp3 音乐

    暂时记录,还有很多需要改善的地方一直没弄好,比如不知道怎么对上正确的播放速度. 有一些多余的代码,不用在意. #include <iostream> #include <fstrea ...

  2. intellij手动创建Mybatis遇到java.io.IOException: Could not find resource mybatis.xml

    将配置文件夹设置成resources即可

  3. MomentJS记录下开发中用到的日期

    1.计算当前周一到周日的日期 ​​​​​​​var weekOfday = moment().format('E');//计算今天是这周第几天 var last_monday = moment().s ...

  4. np.c_与np.r_

    import sys reload(sys) sys.setdefaultencoding('utf-8') import numpy as np def test(): ''' numpy函数np. ...

  5. Windows server 2012文件服务器配置

    文件服务器的管理   Windows server 2012提供了易于使用的管理工具,让系统管理员更有效的管理服务器的资源. 安装文件服务器管理工具 添加角色-安装管理器 安装完成后直接可以在工具中打 ...

  6. XSS常见攻击与防御

    XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意 ...

  7. shell的debug模式

    如何调试shell脚本? 在指定shell运行版本时加上 '-x' #!/bin/bash   -x ➜ demo git:(master) ✗ cat debug.sh #!/bin/bash -x ...

  8. 原生JS实现旋转木马轮播图特效

    大概是这个样子: 首先来简单布局一下(emm...随便弄一下吧,反正主要是用js来整的) <!DOCTYPE html> <html lang="en"> ...

  9. 解决linux乱码问题

    echo "LANG="zh_CN.UTF-8" >> /etc/sysconfig/i18n yum -y install kde-l10n-Chinese ...

  10. list-style: none;

    表明list项前面没有什么修饰(一片空白).