RestTemplate 用法 和 http工具类 这篇就不说了 可以去看下面的博客
本篇文章是 针对 下面的博客 进行的扩展
https://blog.csdn.net/Drug_/article/details/137166797
我们在调用第三方 api接口 时候
在获取相应体的时候 不知道用什么数据类型 去接 响应体里的数据
用 字符串 用 fastjson里的 JSONObject 或者 用 java对象 好像都不方便
如果接到 数据 不是我们想要的对象 我们还需要 来回转换 很烦
比如 用 字符串 接 json字符串
接到后 再 用 fastjson转换成我们想要的 java对象
又比如 用 fastjson里的 JSONObject 对象接 接后 我们要么 get(“aaa”) 去取数据
要么 拿到这个对象 还要再 转换成 java对象
所以有没有 一种方案 指定响应体里的 数据类型 取到 直接是我们想要的
下面 是利用泛型 可以灵活 配置 响应体 接的类型 增强版
之前的 老写法 从上篇博客里复制过来 进行对比的
/**
* 调用第三方服务器接口 get
*
* @param url 路由
* @param httpHeaders 请求头
* @return 返回相应所有参数
*/
public static ResponseEntity<String> doGet(String url, HttpHeaders httpHeaders) throws Exception {
RestTemplate restTemplate = new RestTemplate(RestTemplateConfig.generateHttpRequestFactory());
//此处加编码格式转换
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
// 设置请求头
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity httpEntity = new HttpEntity(httpHeaders);
// 发送 GET 请求
return restTemplate.exchange(url, HttpMethod.GET, httpEntity, String.class);
}
这种 获取到 响应体 用String 来接数据 接到数据后 还要来回转换 数据类型
下面的是 扩展后的写法
目前只扩展了 doGet 方法 post 大家有兴趣 根据 doGet的写法 可以 也扩展一下
这样就不用 获取到 第三方的 json数据 来回转换了 直接用
/**
* 调用第三方服务器接口 get
*
* @param url 路由
* @param httpHeaders 请求头
* @param responseType 响应类型
* @return 返回相应所有参数
*/
public static <T> ResponseEntity<T> doGet(String url, HttpHeaders httpHeaders, ParameterizedTypeReference<T> responseType) throws Exception {
RestTemplate restTemplate = new RestTemplate(RestTemplateConfig.generateHttpRequestFactory());
//此处加编码格式转换
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
// 设置请求头
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity httpEntity = new HttpEntity(httpHeaders);
// 发送 GET 请求
return restTemplate.exchange(url, HttpMethod.GET, httpEntity, responseType);
}
public static <T> T doGet(String url,ParameterizedTypeReference<T> responseType) throws Exception {
return doGet(url,new HttpHeaders(),responseType).getBody();
}
调用 例子:
@Data
public class ParkResponse<T> {
Boolean success;
String errMsg;
T data;
}
这样 返回值 就直接是我们想要的对象 不用来回转换了
ParkResponse<List<ParkRegionSet>> parkResponse = HttpUtil.doGet(url,new ParameterizedTypeReference<ParkResponse<List<ParkRegionSet>>>(){});
if (success.equals(parkResponse.getSuccess())) {
List<ParkRegionSet> data = parkResponse.getData();
if(ObjectUtils.isEmpty(data)){
return new ArrayList<>();
}
return data;
}
解释:
new ParameterizedTypeReference<ParkResponse<List<ParkRegionSet>>>(){}
ParkResponse<List<ParkRegionSet>>
//这个就是 指定 响应体的数据类型 用泛型 这样我们传入什么 就用什么接