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