美文网首页
在Spring项目中使用RestTemplate轻松的完成Htt

在Spring项目中使用RestTemplate轻松的完成Htt

作者: 蔓越莓饼干 | 来源:发表于2017-07-24 11:25 被阅读0次

    我们在项目中经常需要与HTTP服务器进行通信,Spring框架提供了RestTemplate类,可以很方便的与HTTP服务器进行通信。

    一、介绍

    RestTemplateSpring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程HTTP服务的方法,能够大大提高客户端的编写效率。
    调用RestTemplate的默认构造函数,RestTemplate对象在底层通过使用java.net包下的实现创建HTTP请求,可以通过使用ClientHttpRequestFactory指定不同的HTTP请求方式。
    ClientHttpRequestFactory接口主要提供了两种实现方式

    一种是SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)创建底层的HTTP请求连接。
    一种方式是使用HttpComponentsClientHttpRequestFactory方式,底层使用HttpClient访问远程的HTTP服务,使用HttpClient可以配置连接池和证书等信息。

    二、Spring项目中的配置

    下面介绍RestTemplate在Spring项目中的配置

    1、简单配置(用法)

    xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:util="http://www.springframework.org/schema/util"
        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-3.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util-3.0.xsd">
    
    <!--简单的声明Bean即可--->    
    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate"/>
        
    </beans>
    

    2、配合配置链接属性(用法)

    <?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"
           default-autowire="byName" default-lazy-init="true">
     
        <!--方式一、使用jdk的实现-->
        <bean id="requestFactory" class="org.springframework.http.client.SimpleClientHttpRequestFactory">
            <property name="readTimeout" value="10000"/>
            <property name="connectTimeout" value="5000"/>
        </bean>
     
        <bean id="simpleRestTemplate" class="org.springframework.web.client.RestTemplate">
            <constructor-arg ref="requestFactory"/>
            <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">
                        <property name="supportedMediaTypes">
                            <list>
                                <value>text/plain;charset=UTF-8</value>
                            </list>
                        </property>
                    </bean>
                </list>
            </property>
        </bean>
     
    </beans>
    

    3、使用连接池的配置

    <!--使用httpclient的实现,带连接池-->
    <!--在httpclient4.3版本后才有-->
    <bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder" factory-method="create">
        <property name="connectionManager">
            <bean class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager">
                <!--整个连接池的并发-->
                <property name="maxTotal" value="50"/>
                <!--每个主机的并发-->
                <property name="defaultMaxPerRoute" value="50"/>
            </bean>
        </property>
        <!--开启重试-->
        <property name="retryHandler">
            <bean class="org.apache.http.impl.client.DefaultHttpRequestRetryHandler">
                <constructor-arg value="2"/>
                <constructor-arg value="true"/>
            </bean>
        </property>
        <property name="defaultHeaders">
            <list>
                <bean class="org.apache.http.message.BasicHeader">
                    <constructor-arg value="Content-Type"/>
                    <constructor-arg value="text/html;charset=UTF-8"/>
                </bean>
                <bean class="org.apache.http.message.BasicHeader">
                    <constructor-arg value="Accept-Encoding"/>
                    <constructor-arg value="gzip,deflate"/>
                </bean>
                <bean class="org.apache.http.message.BasicHeader">
                    <constructor-arg value="Accept-Language"/>
                    <constructor-arg value="zh-CN"/>
                </bean>
            </list>
        </property>
    </bean>
    
    <bean id="httpClient" factory-bean="httpClientBuilder" factory-method="build"/>
    
    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
        <property name="messageConverters">
            <list value-type="org.springframework.http.converter.HttpMessageConverter">
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <value>text/html;charset=UTF-8</value>
                    </property>
                </bean>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <value>application/json;charset=UTF-8</value>
                    </property>
                </bean>
                <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.FormHttpMessageConverter"/>
                <bean class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter"/>
            </list>
        </property>
        <property name="requestFactory">
            <bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
                <constructor-arg ref="httpClient"/>
                <!--连接时间(毫秒)-->
                <property name="connectTimeout" value="20000"/>
                <!--读取时间(毫秒)-->
                <property name="readTimeout" value="20000"/>
            </bean>
        </property>
    </bean>
    

    三、常用方法

    1、POST方法

    public <T> T postForObject(String url, Object request, Class<T> responseType, Object... uriVariables)
                throws RestClientException
    public <T> T postForObject(String url, Object request, Class<T> responseType, Map<String, ?> uriVariables)
                throws RestClientException
    public <T> T postForObject(URI url, Object request, Class<T> responseType) throws RestClientException
    

    使用示例:

    @Autowired
    private RestTemplate restTemplate;
    
    public void testPost(){
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-Auth-Token", "e348bc22-5efa-4299-9142-529f07a18ac9");
        
        MultiValueMap<String, String> postParameters = new LinkedMultiValueMap<String, String>();
        postParameters.add("owner", "11");
        postParameters.add("subdomain", "aoa");
        postParameters.add("comment", "");
        
        HttpEntity<MultiValueMap<String, String>> requestEntity  = new HttpEntity<MultiValueMap<String, String>>(postParameters, headers);
        
        ParseResultVo exchange = null;
        try {
            exchange = restTemplate.postForObject("http://l-dnsutil1.ops.beta.cn6.qunar.com:10085/v1/cnames/tts.piao",  requestEntity, ParseResultVo.class);
            logger.info(exchange.toString());
        } catch (RestClientException e) {
            logger.error(e);
        }
    }
    
    

    2、GET方法

    public <T> T getForObject(String url, Class<T> responseType, Object... urlVariables) throws RestClientException 
    public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> urlVariables) throws RestClientException
    public <T> T getForObject(URI url, Class<T> responseType) throws RestClientException
    

    使用示例:

    @Autowired
    private RestTemplate restTemplate;
    
    public void testGet(){
        String result = restTemplate.getForObject("https://www.baidu.com", String.class);
        System.out.println(result);
    }
    
    

    参考:
    http://www.cnblogs.com/winner-0715/p/6258139.html

    相关文章

      网友评论

          本文标题:在Spring项目中使用RestTemplate轻松的完成Htt

          本文链接:https://www.haomeiwen.com/subject/xvtbkxtx.html