springboot中基于RestTemplate 类 实现调用第三方API接口,获取响应体内容不需要转换数据类型【丰富版】

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>>  
//这个就是 指定 响应体的数据类型 用泛型  这样我们传入什么  就用什么接 

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-08 20:56:05       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-08 20:56:05       5 阅读
  3. 在Django里面运行非项目文件

    2024-06-08 20:56:05       4 阅读
  4. Python语言-面向对象

    2024-06-08 20:56:05       6 阅读

热门阅读

  1. SWD端口无法连接如何排查

    2024-06-08 20:56:05       13 阅读
  2. 生物神经网络 原理分析研读02

    2024-06-08 20:56:05       15 阅读
  3. Python怎么水?深入剖析编程的奥秘与挑战

    2024-06-08 20:56:05       25 阅读
  4. arm和x86的差别和应用场景学习笔记

    2024-06-08 20:56:05       17 阅读
  5. VUE3 表单输入绑定

    2024-06-08 20:56:05       18 阅读
  6. qt网络事件之QSocketNotifier

    2024-06-08 20:56:05       17 阅读
  7. vscode Run Code输出出现中文乱码情况问题解决方案

    2024-06-08 20:56:05       13 阅读
  8. Facebook海外户&Facebook广告被暂停的原因

    2024-06-08 20:56:05       16 阅读
  9. [知识点]c++运算符重载

    2024-06-08 20:56:05       13 阅读