RestTemplate的使用及需要注意的地方

RestTemplate的使用及需要注意的地方

1,含有泛型对象,注意返回list还是单个实体,返回list需要用ParameterizedTypeReference包装类型,即包装之后才会认识是复合类,不会作为单个类解析

否则Json 异常:Can not deserialize instance of xx out of START_ARRAY token不能转化异常

 ParameterizedTypeReference<List<FinancialSalesUser>> responseType = new ParameterizedTypeReference<List<FinancialSalesUser>>() {

            @Override

            public Type getType() {

               return super.getType();

            }

        };

public class BaseResponseInterface<T> implements Serializable 
ParameterizedTypeReference<BaseResponseInterface<FinancialInterfaceAccount>> responseType = new ParameterizedTypeReference<BaseResponseInterface<FinancialInterfaceAccount>>() {
    @Override
    public Type getType() {
        return super.getType();
    }

}; 

2,注意请求参数实体放在HttpEntity

 HttpEntity<String> httpEntity = new HttpEntity<String>(bodyData, headers);//bodyData参数,headers报文头

HttpEntity<FinancialInterfaceBaseCondition> httpEntity = new HttpEntity<FinancialInterfaceBaseCondition>(bc, headers);

 放在HttpEntity中body的用@RequestBody从body拿,放在最后的参数用@RequestParam或者@PathVariable

返回实体为在后面的类

3,object  map类型的参数放在最后,可以不传

4,最好用exchange作为统一的操作,其他的方法有的只能单个实体之类局限

示例:

配置

 <!--使用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="restTemplate1" 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.json.MappingJackson2HttpMessageConverter"/>//这里和springmvc一致

            </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>

代码:

package com.houbank.incoming.web.controller;

import com.alibaba.dubbo.config.annotation.Reference;

import com.houbank.basic.util.page.Pagination;

import com.houbank.basic.util.response.BaseResponse;

import com.houbank.incoming.api.FinancialSalesUserFacade;

import com.houbank.incoming.model.condition.FinancialSalesUserCondition;

import com.houbank.incoming.model.domain.FinancialSalesUser;

import io.swagger.annotations.Api;

import io.swagger.annotations.ApiOperation;

import io.swagger.annotations.ApiResponse;

import io.swagger.annotations.ApiResponses;

import lombok.extern.slf4j.Slf4j;

import org.apache.commons.collections.CollectionUtils;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.core.ParameterizedTypeReference;

import org.springframework.http.*;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.client.RestTemplate;

import java.lang.reflect.Type;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

/**

 * @author: yy  Date: 2018/3/26 Time: 14:26

 */

@Controller

@Slf4j

@RequestMapping({ "/FinancialInterfaceAccountInfo" })

@Api(value="/FinancialInterfaceAccountInfo",description="账户信息")

public class FinancialInterfaceAccountInfoController {

    @Autowired

    private RestTemplate restTemplate1;

    @Reference

    private FinancialSalesUserFacade financialSalesUserFacade;

    @RequestMapping(value = { "/hygiene" }, method = RequestMethod.GET,produces=MediaType.APPLICATION_JSON_VALUE)

    @ResponseBody

    public Map hygiene() {

        Map<String,String> result = new HashMap<String,String>();

        try {

            result.put("11","22");

            result.put("21","23");

        }catch (Exception e) {

            e.printStackTrace();

        }

        return result;

    }

    @RequestMapping(value = "/RateQuery/result", method = RequestMethod.GET,produces=MediaType.APPLICATION_JSON_VALUE)

    public @ResponseBody FinancialSalesUser getRatedefQueryResult(FinancialSalesUser resultRatedtl) {

        BaseResponse<List<FinancialSalesUser>> baseResponse =new  BaseResponse<List<FinancialSalesUser>>();

        try {

            FinancialSalesUserCondition financialSalesUserCondition = new FinancialSalesUserCondition();

            baseResponse = financialSalesUserFacade.selectAll(financialSalesUserCondition);

        }catch (Exception e) {

            log.error("错误"+e);

        }

        return baseResponse.getData().get(0);

    }

    @RequestMapping(value = "/RateQuery/results", method = RequestMethod.GET,produces=MediaType.APPLICATION_JSON_VALUE)

    public @ResponseBody List<FinancialSalesUser> getRatedefQueryResults(FinancialSalesUser resultRatedtl) {

        BaseResponse<List<FinancialSalesUser>> baseResponse =new  BaseResponse<List<FinancialSalesUser>>();

        try {

            FinancialSalesUserCondition financialSalesUserCondition = new FinancialSalesUserCondition();

            baseResponse = financialSalesUserFacade.selectAll(financialSalesUserCondition);

        }catch (Exception e) {

            log.error("错误"+e);

        }

        return baseResponse.getData();

    }

    @ResponseBody

    @RequestMapping(value = { "/test" }, method = RequestMethod.GET,produces="application/json;charset=UTF-8")

    @ApiResponses(value = {@ApiResponse(code = 200, message = "用户信息test",  response=String.class),

            @ApiResponse(code = 201, message = "q"+ "(token验证失败)",  response=String.class),

            @ApiResponse(code = 202, message = "500" + "(系统错误)",response = String.class)})

    @ApiOperation(value="查询列表",notes="/list",response = String.class)

    public ResponseEntity<List<FinancialSalesUser>>  getTestInfo() {

//        ResponseEntity<FinancialSalesUser> str = restTemplate1.getForEntity(

//                "http://localhost:8080/hb_phonebank_web/FinancialInterfaceAccountInfo/RateQuery/result",

//                FinancialSalesUser.class);

        ParameterizedTypeReference<List<FinancialSalesUser>> responseType = new ParameterizedTypeReference<List<FinancialSalesUser>>() {

            @Override

            public Type getType() {

               return super.getType();

            }

        };

        ResponseEntity<List<FinancialSalesUser>> str = restTemplate1.exchange(

                "http://localhost:8080/hb_phonebank_web/FinancialInterfaceAccountInfo/RateQuery/results",

                HttpMethod.GET,null, responseType);

        System.out.println(str);

        return  str;

    }

    @ResponseBody

    @RequestMapping(value = { "/list" }, method = RequestMethod.GET,produces="application/json;charset=UTF-8")

    @ApiResponses(value = {@ApiResponse(code = 200, message = "用户信息",  response=String.class),

            @ApiResponse(code = 201, message = "q"+ "(token验证失败)",  response=String.class),

            @ApiResponse(code = 202, message = "500" + "(系统错误)",response = String.class)})

    @ApiOperation(value="查询列表",notes="/list",response = String.class)

    public Pagination<FinancialSalesUser> getAccountInfo() {

        String q="";

        BaseResponse<List<FinancialSalesUser>> baseResponse =new  BaseResponse<List<FinancialSalesUser>>();

        String remoteUrl;

        ResponseEntity<Pagination> result =null;

        try {

            /**

             * 设置请求头

             */

            HttpHeaders headers = new HttpHeaders();

            headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8"));

            headers.add("Accuept", MediaType.APPLICATION_JSON.toString());

            /**

             * POST请求参数,根据需要进行封装

             */

            String bodyData = "";//new String(Base64Utils.encode(JSON.toJSONString(ro).getBytes("UTF-8")));

            /**

             * 查看HttpEntity的构造方法,包含只有请求头和只有请求体的情况---请求实体参数

             */

            HttpEntity<String> httpEntity = new HttpEntity<String>(bodyData, headers);

            /**

             * 执行操作

             */

            FinancialSalesUserCondition cd = new FinancialSalesUserCondition();

            remoteUrl="http://localhost:8080/hb_phonebank_web/financialSalesUser/listPage";

            result = restTemplate1.postForEntity(remoteUrl,httpEntity,Pagination.class);

                if (baseResponse != null && CollectionUtils.isNotEmpty(baseResponse.getData())) {

            }

        } catch (Exception e) {

            log.error("错误"+e);

        }

        return result.getBody();

    }

}

参看:

https://blog.csdn.net/ThinkingLink/article/details/45366777 

猜你喜欢

转载自yuhuiblog6338999322098842.iteye.com/blog/2414580