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
相关推荐
然而,有时我们可能需要在不使用 Feign 注解的情况下,利用 RestTemplate 来实现类似的功能。本文将深入探讨如何使用 RestTemplate 进行 FeignClient 调用。 首先,让我们了解什么是 RestTemplate。RestTemplate 是...
尽管如此,`RestTemplate`仍然广泛存在于Spring生态中,特别是在Spring Cloud等项目中,因为很多应用场景并不需要Reactive编程模型。 在Spring环境中,通常推荐使用Spring Boot来启动项目,此时可以引入`spring-...
SpringBoot系列之RestTemplate使用示例,博主之前经常对接一些接口,所以发现写一些http请求比较麻烦,学习springboot的过程知道可以用 RestTemplate来做http请求,RestTemplate 是 Spring Framework 框架封装的基于...
本主题将深入探讨如何使用HttpClient和Spring的RestTemplate工具来实现这一目标。这两种方法都是可靠的,但在不同场景下各有优缺点。 首先,让我们了解HTTP和HTTPS的基本概念。HTTP(超文本传输协议)是用于在Web上...
2. **创建RestTemplate实例**:在需要调用其他服务的类中注入RestTemplate,或者在需要的地方手动创建实例。 ```java @Autowired private RestTemplate restTemplate; ``` 3. **构建请求**:使用RestTemplate的...
只需在需要的地方通过依赖注入使用它: ```java @Autowired private RestTemplate restTemplate; ``` 7. **最佳实践** - 使用 `ResponseEntity` 类来获取完整的 HTTP 响应,包括状态码、头部信息和响应体。 -...
在创建`RestTemplate`实例时,我们需要设置这个自定义的异常处理器: ```java RestTemplate restTemplate = new RestTemplate(); restTemplate.setErrorHandler(new MyRestErrorHandler()); ``` 这样,当请求失败...
在涉及到需要身份验证的场景,比如 HTTP Basic Auth,RestTemplate 也能很好地支持。 HTTP Basic Authentication 是一种简单的身份验证机制,它要求客户端在每个请求中都包含一个认证头(Authorization)。在 Basic...
这篇博客“RestTemplate例子”可能是介绍如何使用`RestTemplate`进行RESTful API调用的实践教程。下面将详细讨论`RestTemplate`的核心概念、用途、使用方法以及其在实际开发中的应用。 `RestTemplate`是Spring的一...
在使用`RestTemplate`之前,你需要先创建一个实例。这通常通过Spring容器自动配置,或者手动实例化: ```java @Autowired private RestTemplate restTemplate; // 或者 RestTemplate restTemplate = new ...
在分布式系统中,服务间的通信是至关重要的,Spring Cloud为微服务架构提供了强大的...不过,需要注意的是,在高并发场景下,可能需要考虑线程安全和性能优化,例如使用`Ribbon`或`Hystrix`进行负载均衡和熔断保护。
需要注意的是,为了使自动重试机制生效,需要将上一节中自定义的异常处理代码注释掉,因为它们可能会覆盖自动重试的行为。 通过这样的配置,当`testEntity()`方法中的HTTP请求返回非200状态码时,Spring Retry会...
当某些接口超时、返回的数据有问题时需要对接口进行重试,但是有的接口需要重试三次,有的需要重试两次,有的不需要重试;有的返回连接超时才重试,有的读取超时才重试,有的404才重试;有的返回-1才重试,有的返回...
Spring 3.0 RestTemplate
在 RESTful Web 服务中,我们经常需要使用 POST 请求来发送数据到服务器端。对于 POST 请求,RestTemplate 提供了两种常用的方法: 1. **`postForObject()`** - **简介**:此方法用于发送 POST 请求,并获取响应体...
如果需要在请求发送前或接收响应后执行某些操作,可以使用`ClientHttpRequestInterceptor`接口实现自定义逻辑,然后将其添加到`RestTemplate`的拦截器链中。 8. **使用Retrofit或WebClient替代** 虽然`...
- **使用占位符传参**:`getForObject()`支持使用占位符,例如`restTemplate.getForObject(url, PostDTO.class, "posts", 1)`,这样可以根据业务需求动态构造URL。 4. JSONPlaceholder作为测试工具 ...