在上一节的文章中,我们学习了restTemplate的基础用法。但是在日常的开发中,我们通常需要更加通用的方式来处理http远程调用。
先来回忆一下,发起一个请求需要哪些步骤:
//1、设置访问url
String url = RemoteUrl + "/id";
//2、设置Http的Header
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
//3、设置访问参数
HashMap<String, Object> params = new HashMap<>();
params.put("name", name);
//4、设置访问的Entity
HttpEntity entity = new HttpEntity<>(params, headers);
ResponseEntity<String> result = null;
try {
//5、发起一个POST请求
result = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
JSONObject data = JSONObject.parseObject(result.getBody()).getJSONObject("data");
return data.getString("id");
可以看到,每次发起http请求调用的时候,我们需要准备一系列的参数。如果在生产中,我们这样处理的话,那将会有很多的重复逻辑。
为了能更好的聚焦业务需求开发,我们需要提炼http远程请求的能力,提供统一的基础调用能力。
今天,就给大家带来restTemplate的使用实战进阶,restTemplate对复杂多层嵌套对象的处理和封装。
将分别通过开发中常用的两种序列化工具 fastjson和jackson来分别给交给大家。
类和对象
定义统一的返回类Result
public class Result<T> {
private String code;
private T data;
private String message;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Fastjson
引入fastjson的依赖,建议使用1.2.68以上的版本,避免安全漏洞。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
自定义restTemplate,以post请求为例,提供统一的封装。
@Component
public class MyRestTemplate {
private Logger logger = LoggerFactory.getLogger(MyRestTemplate.class);
private static final String HTTP_STATUS_SUCCESS = "200";
@Autowired
private RestTemplate restTemplate;
public <T> T postForResult(String url, Class<T> cls, Object body, Object... uriVariables) {
Respo