文章目录
背景
最近项目中需要使用http请求对方数据,一开始考虑使用HttpClient来完成,其基本的流程如下:
- 创建一个http请求。
- 设置请求参数。
- 获取返回结果。
虽然说就这么简单的3步,但其中很多都是模版代码,还要写各种异常处理,实际上还是比较麻烦的。
由于项目中的http请求相对简单,处理过程中不需要关心太多细节,网上搜了一番后,决定采用Spring自带的RestTemplate。
RestTemplate的使用
RestTemplate中,基本的关于http请求的接口主要有下面几个:
// get 请求
public <T> T getForObject();
public <T> ResponseEntity<T> getForEntity();
// post 请求
public <T> T postForObject();
public <T> ResponseEntity<T> postForEntity();
// put 请求
public void put();
// delete
public void delete()
// exchange
public <T> ResponseEntity<T> exchange()
exchange请求可以处理上面各种请求,可以说是一个综合的接口。
在我的项目中,主要就关心get和post接口。可以看到接口主要分两种xxxForObjcet
和xxxForEntity
,前者直接返回自定义的结果对象,只关注返回结果中的主要内容;后者返回一个ResponseEntity对象,除了返回内容外,还包含状态码、请求头等信息。
简单对象映射
RestTemplate会自动构建结果对象,并将请求结果数据填入对象中。例如:
exchange(url, HttpMethod.GET, null, result.class);
上面这行代码,用于处理返回类型为简单类型的请求(这里说的简单是指没有范型,类型嵌套等,可能有误,我没有详细测试过)。
复杂对象映射
对于复杂对象,就需要使用一个名叫ParameterizedTypeReference<T>
的类,T
就是你的结果对象,Spring会去解析其中的对象类型。
假设你有个范型返回类Response<T>
:
public class Response<T> {
private Integer code;
private String message;
private T data;
假设T
为Map<String, String>
类型,为了正确映射结果,使用方式如下:
exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<Response<Map<String, String>>() {
});
RestTemplate踩坑
RestTemplate自动构建结果对象,但是能否正确地将结果值填入相应的变量中,取决于你是否正确设置了用于结果消息转换的转换器。Spring中有个各种消息转换器,他们的公共接口为HttpMessageConverter
。由于在我的项目中,返回的结果为json数据,因此我要设置一个用于将json字符串映射成java对象的转换器。
在设置转换器之前,首先看一下RestTemplate的无参构造函数:
public