`
y806839048
  • 浏览: 1127265 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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 

 

 

分享到:
评论

相关推荐

    使用RestTemplate进行feignclient调用

    然而,有时我们可能需要在不使用 Feign 注解的情况下,利用 RestTemplate 来实现类似的功能。本文将深入探讨如何使用 RestTemplate 进行 FeignClient 调用。 首先,让我们了解什么是 RestTemplate。RestTemplate 是...

    RestTemplate如何在Spring或非Spring环境下使用.docx

    尽管如此,`RestTemplate`仍然广泛存在于Spring生态中,特别是在Spring Cloud等项目中,因为很多应用场景并不需要Reactive编程模型。 在Spring环境中,通常推荐使用Spring Boot来启动项目,此时可以引入`spring-...

    SpringBoot系列之RestTemplate使用示例

    SpringBoot系列之RestTemplate使用示例,博主之前经常对接一些接口,所以发现写一些http请求比较麻烦,学习springboot的过程知道可以用 RestTemplate来做http请求,RestTemplate 是 Spring Framework 框架封装的基于...

    使用httpclient方式和RestTemplate方式调用http及https接口

    本主题将深入探讨如何使用HttpClient和Spring的RestTemplate工具来实现这一目标。这两种方法都是可靠的,但在不同场景下各有优缺点。 首先,让我们了解HTTP和HTTPS的基本概念。HTTP(超文本传输协议)是用于在Web上...

    RestTemplate实现服务间调用demo案例

    2. **创建RestTemplate实例**:在需要调用其他服务的类中注入RestTemplate,或者在需要的地方手动创建实例。 ```java @Autowired private RestTemplate restTemplate; ``` 3. **构建请求**:使用RestTemplate的...

    springRestTemplate

    只需在需要的地方通过依赖注入使用它: ```java @Autowired private RestTemplate restTemplate; ``` 7. **最佳实践** - 使用 `ResponseEntity` 类来获取完整的 HTTP 响应,包括状态码、头部信息和响应体。 -...

    精讲RestTemplate自定义请求失败异常处理.docx

    在创建`RestTemplate`实例时,我们需要设置这个自定义的异常处理器: ```java RestTemplate restTemplate = new RestTemplate(); restTemplate.setErrorHandler(new MyRestErrorHandler()); ``` 这样,当请求失败...

    RestTemplate如何通过HTTP Basic Auth认证.docx

    在涉及到需要身份验证的场景,比如 HTTP Basic Auth,RestTemplate 也能很好地支持。 HTTP Basic Authentication 是一种简单的身份验证机制,它要求客户端在每个请求中都包含一个认证头(Authorization)。在 Basic...

    RestTemplate例子

    这篇博客“RestTemplate例子”可能是介绍如何使用`RestTemplate`进行RESTful API调用的实践教程。下面将详细讨论`RestTemplate`的核心概念、用途、使用方法以及其在实际开发中的应用。 `RestTemplate`是Spring的一...

    RestTemplate常用使用示例.rar

    在使用`RestTemplate`之前,你需要先创建一个实例。这通常通过Spring容器自动配置,或者手动实例化: ```java @Autowired private RestTemplate restTemplate; // 或者 RestTemplate restTemplate = new ...

    SpringCloud简单使用RestTemplate调用对方的服务

    在分布式系统中,服务间的通信是至关重要的,Spring Cloud为微服务架构提供了强大的...不过,需要注意的是,在高并发场景下,可能需要考虑线程安全和性能优化,例如使用`Ribbon`或`Hystrix`进行负载均衡和熔断保护。

    RestTemplate请求失败自动重试机制.docx

    需要注意的是,为了使自动重试机制生效,需要将上一节中自定义的异常处理代码注释掉,因为它们可能会覆盖自动重试的行为。 通过这样的配置,当`testEntity()`方法中的HTTP请求返回非200状态码时,Spring Retry会...

    RestTemplate重试机制源码

    当某些接口超时、返回的数据有问题时需要对接口进行重试,但是有的接口需要重试三次,有的需要重试两次,有的不需要重试;有的返回连接超时才重试,有的读取超时才重试,有的404才重试;有的返回-1才重试,有的返回...

    Spring RestTemplate

    Spring 3.0 RestTemplate

    精讲RestTemplate,POST请求方法使用详解.docx

    在 RESTful Web 服务中,我们经常需要使用 POST 请求来发送数据到服务器端。对于 POST 请求,RestTemplate 提供了两种常用的方法: 1. **`postForObject()`** - **简介**:此方法用于发送 POST 请求,并获取响应体...

    spring rest mvc使用RestTemplate调用

    如果需要在请求发送前或接收响应后执行某些操作,可以使用`ClientHttpRequestInterceptor`接口实现自定义逻辑,然后将其添加到`RestTemplate`的拦截器链中。 8. **使用Retrofit或WebClient替代** 虽然`...

    RestTemplate的GET方法详解.docx

    - **使用占位符传参**:`getForObject()`支持使用占位符,例如`restTemplate.getForObject(url, PostDTO.class, "posts", 1)`,这样可以根据业务需求动态构造URL。 4. JSONPlaceholder作为测试工具 ...

Global site tag (gtag.js) - Google Analytics