spring框架结合RestTemplate实现远程服务调用
一、jar包依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
二、配置文件
<!--创建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>
#######################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###################
三、工具类
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; } }
剩下的就是业务代码层调用工具类来实现具体的业务了。

浙公网安备 33010602011771号