• [Spring Boot]10 使用RestTemplate调用第三方接口


    前言

    工作当中,经常会使用到很多第三方提供的功能或者我们自己家也会提供一些功能给别人使用。
    一般都是通过相互调用API接口的形式,来进行业务功能的对接。
    这里所讲的API接口,一般是指HTTP(s)形式的请求,遵循RESTful的标准。
    传统情况下,在Java代码里面访问restful服务,一般使用Apache的HttpClient,不过此种方法使用起来非常繁琐。
    Spring从3.0开始提供了一种非常简单的模板类来进行操作,这就是RestTemplate。

    Spring Boot如何使用RestTemplate

    1、在项目pom.xml文件中引入web,依赖内容如下:

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
    
    • 1
    • 2
    • 3
    • 4

    一般项目中都会已有此依赖。

    2、封装RestTemplate配置类RestTemplateConfig(一般放在api/conf目录),代码如下:

    package com.***.api.conf;
    
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.config.Registry;
    import org.apache.http.config.RegistryBuilder;
    import org.apache.http.conn.socket.ConnectionSocketFactory;
    import org.apache.http.conn.socket.PlainConnectionSocketFactory;
    import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
    import org.apache.http.impl.client.HttpClientBuilder;
    import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.client.ClientHttpRequestFactory;
    import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
    import org.springframework.web.client.RestTemplate;
    
    @Configuration
    public class RestTemplateConfig {
    
        @Bean
        public ClientHttpRequestFactory httpRequestFactory() {
            return new HttpComponentsClientHttpRequestFactory(httpClient());
        }
    
        @Bean
        public RestTemplate restTemplate() {
            return new RestTemplate(httpRequestFactory());
        }
    
        @Bean
        public HttpClient httpClient() {
            Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
                    .register("http", PlainConnectionSocketFactory.getSocketFactory())
                    .register("https", SSLConnectionSocketFactory.getSocketFactory())
                    .build();
            PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
            connectionManager.setMaxTotal(3000);
            connectionManager.setDefaultMaxPerRoute(1000);
    
            RequestConfig requestConfig = RequestConfig.custom()
                    .setSocketTimeout(3000)
                    .setConnectTimeout(3000)
                    .setConnectionRequestTimeout(3000)
                    .build();
    
            return HttpClientBuilder.create()
                    .setDefaultRequestConfig(requestConfig)
                    .setConnectionManager(connectionManager)
                    .build();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    3、使用举例
    举例调用第三方的一个API接口(POST),根据手机号码获取用户的个人信息。

    	@Override
        public UserInfo isUserHasCalendar(RestTemplate restTemplate, String sMobile) {
            JSONObject postData = new JSONObject();
            postData.put("mobile", sMobile);
            // URL为第三方HTTP接口地址
            String URL =******;
            return restTemplate.postForEntity(URL, postData, UserInfo.class).getBody();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    再拿对接过的小鹅通API接口,举例。
    小鹅通开放API接口文档:
    文档地址: https://api-doc.xiaoe-tech.com/
    1)调用“获取access_token”接口:
    此接口的官方文档:
    在这里插入图片描述
    请求方式为get,关键代码如下:

     public String getXiaoETongToken(RestTemplate restTemplate) {
            String url = "https://api.xiaoe-tech.com/token?app_id=app******&client_id=xop******&secret_key=******&grant_type=client_******";
            ResponseEntity<JSONObject> results = restTemplate.exchange(url, HttpMethod.GET, null, JSONObject.class);
            Token tokenDto = JSONObject.toJavaObject(results.getBody(), Token.class);
            return tokenDto.getData().getAccess_token();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2)调用“查询单个用户信息”接口
    此接口的官方文档:
    在这里插入图片描述
    请求方式为post,通过user_id获取用户信息的关键代码如下:

    public XiaoETongUser getXiaoETongUser(RestTemplate restTemplate, String Token, String userId) {
            XiaoETongUser user = null;
            try {
                String url = "https://api.xiaoe-tech.com/xe.user.info.get/1.0.0";
                JSONObject postData = new JSONObject();
                postData.put("access_token", Token);
                postData.put("user_id", userId);
                Map map = new HashMap();
                String[] list = {"name", "nickname", "wx_union_id", "wx_open_id", "wx_app_open_id", "wx_avatar"};
                map.put("field_list", list);
                postData.put("data", map);
                ResultMap resultMap = restTemplate.postForEntity(url, postData, ResultMap.class).getBody();
                if (resultMap.get("code").equals(0)) {
                    String data = JSON.toJSONString(resultMap.get("data"));
                    user = JSONObject.parseObject(data, XiaoETongUser.class);
                }
            } catch (RestClientException e) {
                e.printStackTrace();
            }
            return user;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    总结

    上面,我只演示了最常使用的请求方式get、post的简单使用方法,当然RestTemplate的功能还有很多,比如:请求方式为delete、put等等,我就不一一举例了,感兴趣的可以去看看RestTemplate的源码。

  • 相关阅读:
    22种常用设计模式示例代码
    LegalQA 数据集 样例数据
    Speech | 轻量级语音合成论文详解及项目实现
    网页开发从无到有——html前端学习(五)
    点云对齐/轨迹对齐方法及论文讲解
    KingbaseES应对表年龄增长过快导致事务回卷
    项目中常用的正则表达式
    【Midjourney入门教程4】与AI对话,写好prompt的必会方法
    TRUNK通信过程
    【 干货】前端开发 需要注意的事项❗️Be Careful❗️
  • 原文地址:https://blog.csdn.net/joinclear/article/details/128115940