Forest-声明式HTTP客户端框架-集成到SpringBoot实现调用第三方restful api并实现接口数据转换

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 Forest-声明式HTTP客户端框架-集成到SpringBoot实现调用第三方restful api并实现接口数据转换,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

场景

Forest

声明式HTTP客户端API框架,让Java发送HTTP/HTTPS请求不再难。它比OkHttp和HttpClient更高层,

是封装调用第三方restful api client接口的好帮手,是retrofit和feign之外另一个选择。

通过在接口上声明注解的方式配置HTTP请求接口。

官网:

Forest

Forest-声明式HTTP客户端框架-集成到SpringBoot实现调用第三方restful api并实现接口数据转换 

代码地址:

forest: 声明式HTTP客户端API框架,让Java发送HTTP/HTTPS请求不再难。它比OkHttp和HttpClient更高层,是封装调用第三方restful api client接口的好帮手,是retrofit和feign之外另一个选择。通过在接口上声明注解的方式配置HTTP请求接口

Forest的功能较多,下面记录一个比较常用的功能,就是调用第三方api获取数据,并将json数据解析成对象。

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

实现

1、需要事先模拟一个第三方api的接口,各种方式均可,除了代码编写、nginx代理等还可以使用如下方式

HTTP JSON接口模拟工具interfake的使用(模拟接口返回json数据):

HTTP JSON接口模拟工具interfake的使用(模拟接口返回json数据)_霸道流氓气质的博客-CSDN博客

按照上面的过程并修改模拟数据的js文件内容为

var Interfake = require('interfake');
var interfake = new Interfake();
interfake.get('/badao').status(200)
.body(
    { 
        "id": 123,
        "name": "霸道的程序猿",
        "age": 100,
        "address":"青岛",
        "banji":"一班"
    }
);
interfake.get('/badaoStu').status(200)
.body(
    { 
        "id": 123,
        "name": "霸道的程序猿",
        "age": 100,
        "address":"青岛",
        "banji":"一班"
    }
);

确保该接口可以用

Forest-声明式HTTP客户端框架-集成到SpringBoot实现调用第三方restful api并实现接口数据转换

 

2、搭建SpringBoot项目

若依前后端分离版手把手教你本地搭建环境并运行项目:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662 

在上面的基础搭建之后,开始集成Forest。

3、SpringBoot项目中添加依赖

        <dependency>
            <groupId>com.dtflys.forest</groupId>
            <artifactId>forest-spring-boot-starter</artifactId>
            <version>1.5.30</version>
        </dependency>

当前版本为1.5.30。

若依框架已经自带json数据的解析依赖。

然后修改配置文件yml,添加forest的相关配置

#Forest 全局配置
forest:
  backend: okhttp3             # 后端HTTP框架(默认为 okhttp3)
  max-connections: 1000        # 连接池最大连接数(默认为 500)
  max-route-connections: 500   # 每个路由的最大连接数(默认为 500)
  max-request-queue-size: 100  # [自v1.5.22版本起可用] 最大请求等待队列大小
  max-async-thread-size: 300   # [自v1.5.21版本起可用] 最大异步线程数
  max-async-queue-size: 16     # [自v1.5.22版本起可用] 最大异步线程池队列大小
  timeout: 3000                # [已不推荐使用] 请求超时时间,单位为毫秒(默认为 3000)
  connect-timeout: 3000        # 连接超时时间,单位为毫秒(默认为 timeout)
  read-timeout: 3000           # 数据读取超时时间,单位为毫秒(默认为 timeout)
  max-retry-count: 0           # 请求失败后重试次数(默认为 0 次不重试)
  ssl-protocol: TLS            # 单向验证的HTTPS的默认TLS协议(默认为 TLS)
  log-enabled: true            # 打开或关闭日志(默认为 true)
  log-request: true            # 打开/关闭Forest请求日志(默认为 true)
  log-response-status: true    # 打开/关闭Forest响应状态日志(默认为 true)
  log-response-content: true   # 打开/关闭Forest响应内容日志(默认为 false)
  async-mode: platform         # [自v1.5.27版本起可用] 异步模式(默认为 platform)

更多详细配置参考官方文档

👜 Springboot环境配置项 | Forest

Forest 可以在forest.variables属性下自定义全局变量。

其中 key 为变量名,value 为变量值。

全局变量可以在任何模板表达式中进行数据绑定。

比如这里把第三方的api的ip和端口以及基础地址等配置在yml中

​
#Forest 全局配置
forest:
  backend: okhttp3             # 后端HTTP框架(默认为 okhttp3)
  max-connections: 1000        # 连接池最大连接数(默认为 500)
  max-route-connections: 500   # 每个路由的最大连接数(默认为 500)
  max-request-queue-size: 100  # [自v1.5.22版本起可用] 最大请求等待队列大小
  max-async-thread-size: 300   # [自v1.5.21版本起可用] 最大异步线程数
  max-async-queue-size: 16     # [自v1.5.22版本起可用] 最大异步线程池队列大小
  timeout: 3000                # [已不推荐使用] 请求超时时间,单位为毫秒(默认为 3000)
  connect-timeout: 3000        # 连接超时时间,单位为毫秒(默认为 timeout)
  read-timeout: 3000           # 数据读取超时时间,单位为毫秒(默认为 timeout)
  max-retry-count: 0           # 请求失败后重试次数(默认为 0 次不重试)
  ssl-protocol: TLS            # 单向验证的HTTPS的默认TLS协议(默认为 TLS)
  log-enabled: true            # 打开或关闭日志(默认为 true)
  log-request: true            # 打开/关闭Forest请求日志(默认为 true)
  log-response-status: true    # 打开/关闭Forest响应状态日志(默认为 true)
  log-response-content: true   # 打开/关闭Forest响应内容日志(默认为 false)
  async-mode: platform         # [自v1.5.27版本起可用] 异步模式(默认为 platform)

  #全局变量定义
  variables:
    thirdApi:
      baseUrl: http://127.0.0.1:666

​

4、创建一个Interface,比如这里叫IBusThirdApiService

import com.dtflys.forest.annotation.BaseRequest;
import com.dtflys.forest.annotation.Get;
import com.ruoyi.system.domain.BusStudent;
import org.springframework.stereotype.Service;


@BaseRequest(baseURL = "${thirdApi.baseUrl}")
@Service
public interface IBusThirdApiService {

    @Get("/badao")
    String getData();

    @Get("/badaoStu")
    BusStudent getStudentData();
}

注意这里的

@BaseRequest(baseURL = “${thirdApi.baseUrl}”)

就是设置该接口的基础地址,这里是引用上面yml中配置的全局变量。

@Service

注入spring容器,可在需要的其他地方自动注入。

通过@Get注解,将上面方法绑定了一个 HTTP 请求, 并默认使用GET方式,并创建两个接口方法,

其中一个是返回字符串,一个是将json数据转换成对象。

这里需要新建对象BusStudent

public class BusStudent extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** id */
    private Integer id;

    /** 姓名 */
    @Excel(name = "姓名")
    private String name;

    /** 年龄 */
    @Excel(name = "年龄")
    private Integer age;

    /** 地址 */
    @Excel(name = "地址")
    private String address;

    /** 班级 */
    @Excel(name = "班级")
    private String banji;

    public void setId(Integer id)
    {
        this.id = id;
    }

    public Integer getId()
    {
        return id;
    }
    public void setName(String name)
    {
        this.name = name;
    }

    public String getName()
    {
        return name;
    }
    public void setAge(Integer age)
    {
        this.age = age;
    }

    public Integer getAge()
    {
        return age;
    }
    public void setAddress(String address)
    {
        this.address = address;
    }

    public String getAddress()
    {
        return address;
    }
    public void setBanji(String banji)
    {
        this.banji = banji;
    }

    public String getBanji()
    {
        return banji;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("id", getId())
            .append("name", getName())
            .append("age", getAge())
            .append("address", getAddress())
            .append("banji", getBanji())
            .toString();
    }
}

5、至此方法调用接口就完成了,注意这里版本是1.5.30,所以不用进行扫描接口的配置,不用再修改启动类

Forest-声明式HTTP客户端框架-集成到SpringBoot实现调用第三方restful api并实现接口数据转换

 

然后便能在其他代码中从 Spring 上下文注入接口实例,然后如调用普通接口那样调用即可。

6、发送请求,这里模拟在定时任务中定时发起请求调用接口

import com.ruoyi.system.domain.BusStudent;
import com.ruoyi.system.service.IBusThirdApiService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
@EnableScheduling
public class FurestTestTask {

    @Autowired
    private IBusThirdApiService iBusThirdApiService;

    @Scheduled(fixedRateString = "5000")
    public void taskGetData() {
        String data = iBusThirdApiService.getData();
        System.out.println("请求getData接口返回数据:"+data);
        BusStudent busStudent = iBusThirdApiService.getStudentData();
        System.out.println("请求getStudentData接口返回数据:"+busStudent);
    }
}

运行结果

Forest-声明式HTTP客户端框架-集成到SpringBoot实现调用第三方restful api并实现接口数据转换

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135780.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!