spring框架结合RestTemplate实现远程服务调用

一、jar包依赖

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
</dependency>
pom.xml

二、配置文件

<!--创建httpclient的连接池 -->
<bean id="httpClientConnectionManager"
    class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager"
    destroy-method="shutdown">
    <!-- 设置最大连接数 -->
    <property name="maxTotal" value="${http.maxTotal}" />
    <!-- 设置每个主机的并发数 -->
    <property name="defaultMaxPerRoute" value="${http.defaultMaxPerRoute}" />
</bean>

<!-- 创建httpClient对象 -->
<!-- httpClient是由HttpClientBuilder通过build方法创建,这个可以设置连接池 -->
<!-- 1.创建HttpClientBuilder -->
<bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder">
    <!--设置连接池 -->
    <property name="connectionManager" ref="httpClientConnectionManager"></property>
</bean>
<!-- 2.创建httpClient -->
<!-- 通过httpClientBulider得到httpClient对象,并且设置httpClient为多例模式 -->
<!-- 要保证httpClient为多利,以为每次都是新的http请求 -->
<bean id="httpClient" class="org.apache.http.impl.client.CloseableHttpClient"
    factory-bean="httpClientBuilder" factory-method="build" scope="prototype" />

<!-- 构造请求参数 -->
<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}" />
    <!-- 提交请求前测试连接是否可用 -->
    <property name="staleConnectionCheckEnabled" value="${http.staleConnectionCheckEnabled}" />
</bean>
<bean id="requestConfig" class="org.apache.http.client.config.RequestConfig"
    factory-bean="requestConfigBuilder" factory-method="build" />

<bean id="clientHttpRequestFactory"
    class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
    <constructor-arg ref="httpClient" />
    <!--连接超时时间,毫秒 -->
    <!-- <property name="connectTimeout" value="${http.connectTimeout}"/> 读写超时时间,毫秒 
        <property name="readTimeout" value="${http.socketTimeout}"/> -->
</bean>

<!--清理无效的http连接 -->
<!-- <bean class="com.web.service.IdleConnectionEvictor" destroy-method="shutdown"> 
    <constructor-arg index="0" ref="httpClientConnectionManager"></constructor-arg></bean> -->

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
    <constructor-arg ref="clientHttpRequestFactory" />
    <property name="errorHandler">
        <bean class="org.springframework.web.client.DefaultResponseErrorHandler" />
    </property>
    <property name="messageConverters">
        <list>
            <!-- <bean class="org.springframework.http.converter.FormHttpMessageConverter"/> -->
            <!-- <bean class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter"/> -->
            <!-- <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> 
                <bean class="org.springframework.http.converter.StringHttpMessageConverter"> -->
            <bean
                class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
            <bean
                class="org.springframework.http.converter.StringHttpMessageConverter" />
            <bean
                class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
            <bean
                class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" />
            <bean
                class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter" />
            <bean
                class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/plain;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </list>
    </property>
</bean>
spring-demo.xml
#######################The config for HttpClient###################
#最大连接数
http.maxTotal=300
#并发数
http.defaultMaxPerRoute=50
#创建连接的最长时间
http.connectTimeout=1000
#从连接池中获取到连接的最长时间
http.connectionRequestTimeout=500
#数据传输的最长时间
http.socketTimeout=20000
#提交请求前测试连接是否可用
http.staleConnectionCheckEnabled=true
#######################The config for HttpClient###################
spring-demo.properties

三、工具类

import java.util.Collections;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class RestTemplateUtils {
    
    
    private static final Logger LOGGER = LoggerFactory.getLogger(RestTemplateUtils.class);
    
    @Autowired
    private RestTemplate restTemplate;

    /**
     * post请求.
     *
     * @param url
     * @param formParams
     * @return TODO:请对所有【参数】还有【返回结果】进行说明
     */
    public  String doPostForEntity(String url, Object formParams){
        //设置head  
        HttpHeaders requestHeaders = new HttpHeaders();   
        requestHeaders.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8"));
        requestHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        HttpEntity<?> request=new HttpEntity(formParams, requestHeaders);
        ResponseEntity<String> response = restTemplate.postForEntity(url,
                request, String.class);
        if(StringUtils.isNotEmpty(response.getStatusCode().toString())){
            LOGGER.info("restemplate post return status code :"+response.getStatusCode().toString());
        }
        String jsonObject = null;
        if (response != null) {
            jsonObject = response.getBody();
        }
        return jsonObject;
    }
}
RestTemplateUtils.java

 

剩下的就是业务代码层调用工具类来实现具体的业务了。

 

posted @ 2020-07-02 16:18  ITDeveloper  阅读(351)  评论(0)    收藏  举报