文档章节

spring整合httpClient工具类

吕兵阳
 吕兵阳
发布于 2016/05/07 13:23
字数 796
阅读 3271
收藏 26

本文整合基于httpclient目前最新版本4.5.1

首先加入httpclient的依赖

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.1</version>
</dependency>

接下来spring-http的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--定义连接管理器-->
    <bean id="connectionManager" class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager"
          destroy-method="close">
        <!-- 最大连接数 -->
        <property name="maxTotal" value="${http.maxTotal}"/>
        <!--设置每个主机最大的并发数-->
        <property name="defaultMaxPerRoute" value="${http.defaultMaxPerRoute}"/>
    </bean>

    <!--定义HttpClient构建器-->
    <bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder" factory-method="create">
        <property name="connectionManager" ref="connectionManager"/>
    </bean>

    <!--定义httpClient对象,该bean一定是多例的-->
    <bean id="httpClient" class="org.apache.http.impl.client.CloseableHttpClient" factory-bean="httpClientBuilder"
          factory-method="build" scope="prototype"></bean>
    <!--定义requestConfig构建器-->
    <bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig.Builder">
        <!--设置创建连接的最长时间-->
        <property name="connectTimeout" value="${http.connectTimeout}"/>
        <!--从连接池中获取到连接的最长时间-->
        <property name="connectionRequestTimeout" value="${http.connectionRequestTimeout}"/>
        <!--数据传输的最长时间-->
        <property name="socketTimeout" value="${http.socketTimeout}"/>
    </bean>
    <!--请求参数对象-->
    <bean class="org.apache.http.client.config.RequestConfig" factory-bean="requestConfigBuilder"
          factory-method="build"></bean>
<!--定期清理无效连接-->
    <bean class="org.apache.http.impl.client.IdleConnectionEvictor" destroy-method="shutdown">
        <constructor-arg index="0" ref="connectionManager"/>
        <constructor-arg index="1" value="${http.maxIdleTime}"/>
        <constructor-arg index="2" value="MINUTES"/>
    </bean>
</beans>

httpclient.properties的配置文件:

#设置连接总数
http.maxTotal=500
#设置每个主机最大的并发数
http.defaultMaxPerRoute=100
#设置创建连接的最长时间
http.connectTimeout=2000
#从连接池中获取到连接的最长时间
http.connectionRequestTimeout=500
#数据传输的最长时间
http.socketTimeout=6000
#空闲时间(用于定期清理空闲连接)
http.maxIdleTime = 1

httpclient封装的工具类:

@Service
public class ApiService {
    @Autowired
    private CloseableHttpClient httpClient;
    @Autowired
    private RequestConfig requestConfig;

    /**
     * 执行get请求,200返回响应内容,其他状态码返回null
     *
     * @param url
     * @return
     * @throws IOException
     */
    public String doGet(String url) throws IOException {
        //创建httpClient对象
        CloseableHttpResponse response = null;
        HttpGet httpGet = new HttpGet(url);
        //设置请求参数
        httpGet.setConfig(requestConfig);
        try {
            //执行请求
            response = httpClient.execute(httpGet);
            //判断返回状态码是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                return EntityUtils.toString(response.getEntity(), "UTF-8");
            }
        } finally {
            if (response != null) {
                response.close();
            }
        }
        return null;
    }

    /**
     * 执行带有参数的get请求
     *
     * @param url
     * @param paramMap
     * @return
     * @throws IOException
     * @throws URISyntaxException
     */
    public String doGet(String url, Map<String, String> paramMap) throws IOException, URISyntaxException {
        URIBuilder builder = new URIBuilder(url);
        for (String s : paramMap.keySet()) {
            builder.addParameter(s, paramMap.get(s));
        }
        return doGet(builder.build().toString());
    }

    /**
     * 执行post请求
     *
     * @param url
     * @param paramMap
     * @return
     * @throws IOException
     */
    public HttpResult doPost(String url, Map<String, String> paramMap) throws IOException {
        HttpPost httpPost = new HttpPost(url);
        //设置请求参数
        httpPost.setConfig(requestConfig);
        if (paramMap != null) {
            List<NameValuePair> parameters = new ArrayList<NameValuePair>();
            for (String s : paramMap.keySet()) {
                parameters.add(new BasicNameValuePair(s, paramMap.get(s)));
            }
            //构建一个form表单式的实体
            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters, Charset.forName("UTF-8"));
            //将请求实体放入到httpPost中
            httpPost.setEntity(formEntity);
        }
        //创建httpClient对象
        CloseableHttpResponse response = null;
        try {
            //执行请求
            response = httpClient.execute(httpPost);
            return new HttpResult(response.getStatusLine().getStatusCode(), EntityUtils.toString(response.getEntity()));
        } finally {
            if (response != null) {
                response.close();
            }
        }
    }

    /**
     * 执行post请求
     *
     * @param url
     * @return
     * @throws IOException
     */
    public HttpResult doPost(String url) throws IOException {
        return doPost(url, null);
    }


    /**
     * 提交json数据
     *
     * @param url
     * @param json
     * @return
     * @throws ClientProtocolException
     * @throws IOException
     */
    public HttpResult doPostJson(String url, String json) throws ClientProtocolException, IOException {
        // 创建http POST请求
        HttpPost httpPost = new HttpPost(url);
        httpPost.setConfig(this.requestConfig);

        if (json != null) {
            // 构造一个请求实体
            StringEntity stringEntity = new StringEntity(json, ContentType.APPLICATION_JSON);
            // 将请求实体设置到httpPost对象中
            httpPost.setEntity(stringEntity);
        }
        CloseableHttpResponse response = null;
        try {
            // 执行请求
            response = this.httpClient.execute(httpPost);
            return new HttpResult(response.getStatusLine().getStatusCode(),
                    EntityUtils.toString(response.getEntity(), "UTF-8"));
        } finally {
            if (response != null) {
                response.close();
            }
        }
    }
}

http执行post请求返回的封装类:

public class HttpResult {
    private Integer code;
    private String data;

    public HttpResult(Integer code, String data) {
        this.code = code;
        this.data = data;
    }

    public HttpResult() {
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}


© 著作权归作者所有

共有 人打赏支持
吕兵阳
粉丝 88
博文 275
码字总数 105273
作品 0
郑州
后端工程师
私信 提问
【java程序员理解HTTP】【6】实践--java 中几种模拟 http 请求的方式

几种方式或说方案 Jdk本身提供 java.net 包的 HttpURLConnection Apache提供HttpClient Spring Web提供RestTemplate 以上都可以在java代码中模拟实现http请求,是随着技术的进步出来的,总体...

karma123
08/15
0
0
Spring RestTemplate 实践

什么是RestTemplate? RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。 调用RestTemplate的默认构...

单红宇
2016/03/18
0
0
聊聊spring cloud gateway的NettyConfiguration

序 本文主要研究下spring cloud gateway的NettyConfiguration NettyConfiguration spring cloud gateway使用的是reactor的httpclient,其通过nettyClientOptions这个bean来进行构造options,......

go4it
06/03
0
0
Spring for Android 2.0.0.M2 发布

Spring for Android 2.0.0.M2 发布,此版本值得关注的改进: 通过 HttpComponentsClientHttpRequestFactory 支持 Android 的 HttpClient 4.3 支持 HttpClient 4.0 RestTemplate 支持 HTTP P......

oschina
2014/12/10
4.5K
10
疯狂Spring Cloud连载(12)——自定义Feign客户端

本文节选自《疯狂Spring Cloud微服务架构实战》 京东购买地址:https://item.jd.com/12256011.html 当当网购买地址:http://product.dangdang.com/25201393.html Spring Cloud教学视频:htt...

杨大仙的程序空间
2017/10/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

追加字节能优化性能

这种方式看起来很神奇,单如果深入理解处理器架构就能理解其中的奥秘。让我们先来看看LinkedTransferQueue这个类,它使用一个内部类型来定义队列的头队列Head和尾节点tail,二这个内部类Pad...

无知的小狼
20分钟前
0
0
性能优化(JVM概念及配置)

虚拟机组成 一次编写,到处运行 Java虚拟机是对操作系统的模拟,隔离差异 2018编程语言排行榜 一个复杂的构架 虚拟机的内部概念 运行原理 编译器,解释器执行流程 内存分配-线程模型 栈帧模型...

这很耳东先生
27分钟前
3
0
Scala之初步认识与环境准备

1. 了解 Scala 1.1. 什么是 Scala Scala 是 Scalable Language 的简写,是一门多范式的编程语言。 Scala设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚...

飞鱼说编程
48分钟前
4
0
Vue项目分环境打包的实现步骤

在项目开发中,我们的项目一般分为开发版、测试版、Pre版、Prod版。Vue-cli的默认环境一只有dev和prod两个,之前每次要发布测试版或Pre版都是修改了源码中API地址后打包,这样很麻烦。如果能...

peakedness丶
48分钟前
6
0
vue+lowdb+express

搭建流程: 1.安装Node.js; 2.安装npm; 3.安装Express; 搭建流程 npm install -g express 安装 express 生成器 npm install -g express-generator 查看是否安装成功,随便输的一个命令...

Js_Mei
54分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部