HttpClient之用CloseableHttpClient发送post请求
时间:2019-12-19
本文章向大家介绍HttpClient之用CloseableHttpClient发送post请求,主要包括HttpClient之用CloseableHttpClient发送post请求使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
使用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 { protected static Logger logger = Logger.getLogger(HttpTest.class); //请求超时时间,这个时间定义了socket读数据的超时时间,也就是连接到服务器之后到从服务器获取响应数据需要等待的时间,发生超时,会抛出SocketTimeoutException异常。 private static final int SOCKET_TIME_OUT = 60000; //连接超时时间,这个时间定义了通过网络与服务器建立连接的超时时间,也就是取得了连接池中的某个连接之后到接通目标url的连接等待时间。发生超时,会抛出ConnectionTimeoutException异常 private static final int CONNECT_TIME_OUT = 60000; private static List<NameValuePair> createParam(Map<String, Object> param) { //建立一个NameValuePair数组,用于存储欲传送的参数 List<NameValuePair> nvps = new ArrayList <NameValuePair>(); if(param != null) { for(String k : param.keySet()) { nvps.add(new BasicNameValuePair(k, param.get(k).toString())); } } return nvps; } /** * 发送 post 请求 * @param url 请求地址,如 http://www.baidu.com * @param param相关参数, 模拟form 提交 * @return * @throws Exception */ public static String postForAPP(String url, String sMethod, Map<String, Object> param, Map<String, Object> headers) throws Exception { //目前HttpClient最新版的实现类为CloseableHttpClient CloseableHttpClient client = HttpClients.createDefault(); CloseableHttpResponse response = null; HttpEntity entity=null; try { if(param != null) { //建立Request的对象,一般用目标url来构造,Request一般配置addHeader、setEntity、setConfig HttpPost req = new HttpPost(url); entity=new UrlEncodedFormEntity(createParam(param), Consts.UTF_8); //setHeader,添加头文件 Set<String> keys = headers.keySet(); for (String key : keys) { req.setHeader(key, headers.get(key).toString()); } //setConfig,添加配置,如设置请求超时时间,连接超时时间 RequestConfig reqConfig = RequestConfig.custom().setSocketTimeout(SOCKET_TIME_OUT).setConnectTimeout(CONNECT_TIME_OUT).build(); req.setConfig(reqConfig); //setEntity,添加内容 req.setEntity(entity); //执行Request请求,CloseableHttpClient的execute方法返回的response都是CloseableHttpResponse类型 //其常用方法有getFirstHeader(String)、getLastHeader(String)、headerIterator(String)取得某个Header name对应的迭代器、getAllHeaders()、getEntity、getStatus等 response = client.execute(req); entity = response.getEntity(); //用EntityUtils.toString()这个静态方法将HttpEntity转换成字符串,防止服务器返回的数据带有中文,所以在转换的时候将字符集指定成utf-8就可以了 String result= EntityUtils.toString(entity, "UTF-8"); logger.error("-------------------------"+result+"-------------"); if(response.getStatusLine().getStatusCode()==200){ logger.error(result+"-----------success------------------"); return result; }else{ logger.error(response.getStatusLine().getStatusCode()+"------------------fail-----------"); return null; } } return null; } catch(Exception e) { logger.error("--------------------------post error: ", e); throw new Exception(); }finally{ //一定要记得把entity fully consume掉,否则连接池中的connection就会一直处于占用状态 EntityUtils.consume(entity); logger.error("---------------------------finally-------------"); System.out.println("---------------------------------------------------"); } } public static void main(String[] args) throws Exception { Map<String, Object> param=new HashMap<String, Object>(); param.put("pdata", "mm"); Map<String, Object> headers=new HashMap<String, Object>(); headers.put("appid", "mm"); postForAPP("http://localhost:8080/SpringMVC-httpclient/greeting", "aa", param, headers); }
原文地址:https://www.cnblogs.com/zouhong/p/12066741.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Ray,面向新兴AI应用的分布式框架
- 60.Vue export default 和 export 的使用方式
- Idea开发maven插件
- redis实战 migrate异常NOAUTH Authentication required.
- linux内存使用情况分析(free + top)
- Centos7 python3安装
- crontab JAVA_HOME not found
- Centos7 源码安装mysql5.6
- mysql登录时报socket找不到终极解决方案
- Grafana将数据库由sqlite3改为mysql
- Python自学成才之路 带有参数的装饰器
- Grafana 将默认的元数据库 sqlite 改为 mysql
- 使用IDEA整合spring4+spring mvc+hibernate
- springmvc中@PathVariable和@RequestParam的区别
- centos7 安装mysql5.6