使用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) 释放连接。无论执行方法是否成功,都必须释放连接
代码如下:

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

HttpClient之用CloseableHttpClient发送post请求的更多相关文章

  1. HttpClient发送Post请求,get请求

    // 创建默认的httpclient实例 CloseableHttpClient httpclient = getHttpClient(); CloseableHttpResponse respons ...

  2. 高德地图web端笔记;发送http请求的工具类

    1.查询所有电子围栏 package com.skjd.util; import java.io.BufferedReader; import java.io.InputStream; import ...

  3. JavaWeb 发送post请求的2种方式(form、json)

      JavaWeb 发送post请求的2种方式(form.json) CreationTime--2018年6月20日10点15分 Author:Marydon 前提:通过HttpClient来实现 ...

  4. 【JAVA】通过HttpClient发送HTTP请求的方法

    HttpClient介绍 HttpClient 不是一个浏览器.它是一个客户端的 HTTP 通信实现库.HttpClient的目标是发 送和接收HTTP 报文.HttpClient不会去缓存内容,执行 ...

  5. httpclient 发送一个请求

    httpclient版本 4.1 发送一个post请求 public static JSONObject post(String url,JSONObject json){ HttpClient cl ...

  6. 通过 Apache Commons HttpClient 发送 HTTPS 请求

    1.通过 HTTPS 发送 POST 请求: 2.HTTPS 安全协议采用 TLSv1.2: 3. 使用代理(Proxy)进行 HTTPS 访问: 4.指定 Content-Type 为:applic ...

  7. 【java】httpclient的使用之java代码内发送http请求

    场景: 需要本项目发送HTTP请求到另一个项目中,处理完成返回值给本项目. 1.本项目引入架包 <!-- httpclient 后台发送http请求--> <dependency&g ...

  8. 使用User-Agent防止HttpClient发送http请求时403 Forbidden和安全拦截

    问题的抛出 今天有客户反映,批付交易完成后,在我方服务器以“服务器点对点通信”的方式通知请求对方服务器时,对方拦截了请求.并贴了一张截图. 从截图可以看出来,对方拦截了我们的user-agent(Ap ...

  9. 使用HttpClient来异步发送POST请求并解析GZIP回应

    .NET 4.5(C#): 使用HttpClient来异步发送POST请求并解析GZIP回应 在新的C# 5.0和.NET 4.5环境下,微软为C#加入了async/await,同时还加入新的Syst ...

随机推荐

  1. form表单input回车提交问题

    问题:文本框输入完成后点击回车页面刷新问题出在form上,当表单中只有一个文本框的时候获取焦点并点击回车之后会提交表单内容,就会发生刷新事件. 解决方法: 1.增加一个隐藏的输入框 <input ...

  2. MySQL 字符串分隔成行&子串统计

    利用help_topic表把字符串转换成行(分隔符号',') ),) as `id` FROM mysql.`help_topic`; 统计字符串每个子串出现次数(分隔符号',') ),) AS `s ...

  3. Linux中jar包启动和jar包后台运行

    Linux 运行jar包命令如下: 方式一: java -jar shareniu.jar 特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? ...

  4. Python—定时任务(APScheduler实现)

    简介                 APScheduler的全称是Advanced Python Scheduler.它是一个轻量级的基于Quartz的 Python 定时任务调度框架.APSche ...

  5. a是什么??

    //解决Linux下默认中文字体乱码问题 QFont font("simsun", 11, QFont::Normal, false); a.setFont(font);

  6. C++ explicit关键字,修饰构造函数,ctor

    #include <iostream> // operator Type() 类型操作符重载 // operator int() // operator double() // ... / ...

  7. Mysql的旧版本下载地址

    直接进入:http://downloads.mysql.com/archives/community/

  8. 关于如何将sublime配置C++环境的总结

    首先我得说,嗯,为了这个玩意为翻烂了99%的百度能搜到的文章.研究了关于Win7 32位,64位,Win10版本的配置,Win10的已经写好了一篇文章,可是Win7党(我是都用的,在家用Win10,学 ...

  9. 为什么 Go 标准库中有些函数只有签名,没有函数体?

    如果你看过 Go 语言标准库,应该有见到过,有一些函数只有签名,没有函数体.你有没有感觉到很奇怪?这到底是怎么回事?我们自己可以这么做吗?本文就来解密它. 首先,函数肯定得有实现,没有函数体,一定是在 ...

  10. 多线程十 Timer

    定时/计算在java中主要使用的是Timer对象,他的内部依然是采用多线程方式进行处理 它有四个构造方法 方法名 作用 Timer() 空参 Timer(String name) 指定名字 Timer ...