Skip to content

Releases: dromara/forest

v1.5.30

10 Apr 03:13
Compare
Choose a tag to compare

v1.5.30版本发布了,这次版本更新有了较大的改动,支持和适配了 SpringBoot3 和 Solon 框架,将XML模块拆分出了主模块,以及新增了延迟参数特性

适配 SpringBoot3

项目中新增了forest-spring-boot3-starter模块,集成时需引入如下的依赖

<!-- Forest 的 SpringBoot3 适配模块 -->
<dependency>
    <groupId>com.dtflys.forest</groupId>
    <artifactId>forest-spring-boot3-starter</artifactId>
    <version>1.5.30</version>
</dependency>

<!-- Forest 的 Jakarta XML 支持模块 -->
<dependency>
    <groupId>com.dtflys.forest</groupId>
    <artifactId>forest-jakarta-xml</artifactId>
    <version>1.5.30</version>
</dependency>

如果是老版本 SpringBoot,依赖方式基本不变,但XML的模块需额外引入

<!-- Forest 对 SpringBoot1或2 的适配模块 -->
<dependency>
    <groupId>com.dtflys.forest</groupId>
    <artifactId>forest-spring-boot-starter</artifactId>
    <version>1.5.30</version>
</dependency>

<!-- Forest 的 JAXB 支持模块 -->
<dependency>
    <groupId>com.dtflys.forest</groupId>
    <artifactId>forest-jaxb</artifactId>
    <version>1.5.30</version>
</dependency>

具体做法参考示例项目 https://gitee.com/dromara/forest/tree/master/forest-examples

适配 Solon

项目中新增了forest-solon-plugin模块,集成时需引入如下的依赖

<!-- Forest 的 Solon 适配模块 -->
<dependency>
    <groupId>com.dtflys.forest</groupId>
    <artifactId>forest-solon-plugin</artifactId>
    <version>1.5.30</version>
</dependency>

<!-- Fastjson、Jackson、Gson 中任选一个JSON框架 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.83</version>
</dependency>

<!-- Forest 的 JAXB 支持模块 -->
<dependency>
    <groupId>com.dtflys.forest</groupId>
    <artifactId>forest-jaxb</artifactId>
    <version>1.5.30</version>
</dependency>

具体做法参考示例项目 https://gitee.com/dromara/forest/tree/master/forest-examples

关于XML模块的说明

本次更新将XML序列化和反序列化相关功能移出了forest-core主模块,需根据不同的项目情况选择相应的 Forest XML 模块依赖。

如果项目,即普通非 SpringBoot3 项目(Spring、SpringBoot1或2)JDK版本也在17以下的项目,则用forest-jaxb依赖

<!-- Forest 的 JAXB 支持模块 -->
<dependency>
    <groupId>com.dtflys.forest</groupId>
    <artifactId>forest-jaxb</artifactId>
    <version>1.5.30</version>
</dependency>

如果您的项目是 SpringBoot3,或是 JDK 17及以上版本的项目,这选择forest-jakarta-xml依赖

<!-- Forest 的 Jakarta XML 支持模块 -->
<dependency>
    <groupId>com.dtflys.forest</groupId>
    <artifactId>forest-jakarta-xml</artifactId>
    <version>1.5.30</version>
</dependency>

延迟参数 (Lambda参数)

有很多情况,Header、Query、Body的参数值不能马上得出,而是在请求发送前的那一刻(所有请求参数都到位时)才能得出,典型的例子就是加签验证的场景(在Header中添加一个参数token,而token的值是对整个body做加密的结果)

  • 请求头的延迟参数
Forest.post("/test")
        .addHeader("Content-Type", "application/json; charset=UTF-8")
        // 这里传入的是一个 Lambda 表达式,它会在请求发送的前一刻才执行
        // 将会通过对整个请求的Body做序列化后再进行Base64运算得出一个值,并给到Authorization请求头
        .addHeader("Authorization", req -> Base64.encode("Token=" + req.body().encodeToString()))
        .addBody("id", "1972664191")
        .addBody("name", "XieYu20011008")
        .execute();
  • 请求体的延迟参数
Forest.post("/test")
        .addHeader("Content-Type", "application/json; charset=UTF-8")
        .addHeader("_id", "20011008")
        .addBody("id", "1972664191")
        // 这里传入的是一个 Lambda 表达式,它会在请求发送的前一刻才执行
        // 执行过程和原理同上
        .addBody("name", req -> "Foo" + req.headerValue("_id"))
        .addBody("token", req -> Base64.encode(req.body().encode()))
        .execute();

这里在延迟参数Lambda表达式中调用的req.body().encode()执行的body序列化过程,会自动排除调用它的延迟参数本身,所以不必担心会发生死循环的情况

新增特性

  • feat: 适配 springboot3
  • feat: 适配 solon
  • feat: 延迟参数 (Lambda参数),支持 Query, Header,Body 三种参数的延迟求值
  • feat: 可自定义异步请求池拒绝策略
  • feat: 请求体序列化接口,ForestRequest.body().encode() 和 ForestRequest.body().encodeToString()

修复问题

  • fix: #I63WWN ForestProxy添加header没有效果
  • fix: onBodyEncode 生命周期顺序问题
  • fix: 不同 ForestConfiguration 对象共用同一个异步线程池的问题
  • fix: 无法解析 localhost:8080 这类省略 http:// 的 url

其他改动

  • reflector: 将xml解析模块拆分成了 forest-jaxb 和 forest-jakarta-xml 两个子模块,需要的情况要分别自行引入
  • reflector: request body encoder
  • refactor: Forest Body clone
  • refactor: 构建 Query String 部分
  • add: HTTPRoxy 注解的 headers 属性
  • add: forest 示例工程

特别鸣谢

特别感谢 Solon 作者 (@noear_admin) 对 Forest 项目在 Solon 适配上的支持

v1.5.28

07 Dec 03:12
Compare
Choose a tag to compare

v1.5.28版本发布了,此次版本发布是小版本更新,主要是修复一些BUG,并添加了onBodyEncode拦截器回调函数

新增特性

  • feat: 拦截器新增 onBodyEncode 回调函数 (#I4WF5Q)
  • feat: 隐式转换带 BasicAuth 认证信息的请求 (#I62BTW)
  • feat: 声明式接口可返回 ForestFuture<T> 类型

修复问题

  • fix: 下载文件,从URL中取得文件名时前后双引号的问题 (#I61NPK)
  • fix: 参数为空,导致空指针问题 (110)
  • fix: @HttpClient 和 @OkHttp3 注解在 1.5.27 失效的问题
  • fix: SpringSSLKeyStore构造方法缺少参数导致SpringBoot项目启动失败
  • fix: Null Pointer Error 当指定RetryWhen (#I5WEBC)
  • fix: @BaseRequest里的 connectTimeout和readTimeout没效果 (#I5WC6U)
  • fix: 接口上@address注解的basePath设置为完整URL时,request.basePath() 结果不正确

特别鸣谢

v1.5.26

08 Aug 04:25
Compare
Choose a tag to compare

Forest v1.5.26版本发布了!此次更新主要对一些BUG进行修复

新增特性

  • feat: 在使用 OkHttp3 后端情况下,允许Query参数不转义大括号 (#I5ITW9)
  • feat: 在使用 OkHttp3 时绕过空 Multipart 错误 (#I5I1AC)

修复问题

  • fix: 默认自动绕过SSL验证
  • fix: 声明的接口返回类型如果是String(或其他Charsequencel类型)导致自定义converter (#I5L2P6)
  • fix: okhttp后端自动将charset=UTF-8转成了小写 (#I5L4AS)
  • fix: url域名信息参数赋值会自动参数后添加”/“符号路径导致错误 (#I5I62P)
  • fix: URL路径中的$字符会被转义
  • fix: 请求的ForestURL的ssl属性没有继承类里@BaseRequest的ssl信息 (#I5HXHX)

其它改动

  • update: 更新 spring 版本到5.3.19
  • update: 更新 spring boot 版本到2.6.7

v1.5.23

21 Jun 05:44
Compare
Choose a tag to compare

Forest v1.5.23 版本发布了!此次版本更新对请求执行的性能进行了彻底的优化!

将 OkHttp3 后端的请求 QPS 提升了 3 倍多!

将 Httpclient 后端的请求 QPS 提升了 1 倍多!

优化内容

  1. 引入了 ForestRoute 路由的概念,每个 Host + Port 的不同组合对应不同的路由
  2. 将 OkHttpClient 以及 HttpClient 后端 Client 对象归类到不同的路由,并进行缓存
  3. 可以从外部注入自定义的后端 Client 对象
  4. 接口的后端 Client 对象是否缓存是可选项,可通过@BackendClient注解进行配置

新增特性

  • feat: 快速接口支持快速下载文件
  • feat: 可配置注入OkHttpClient和HttpClient对象 (#I5CWAL)
  • feat: 可配置接口的后端Client对象是否缓存 (#I5D818)

BUG修复

  • fix: springboot配置binary转换器初始化失败 (#I5D07S)
  • fix: ForestResponse.statusIs(xxx)会出现空指针 (#I5CWQL)
  • fix: 在@address注解的basePath中写的端口号会失效 (#I5CR15)
  • fix: 使用@httpproxy注解对https请求设置http代理后出现java.lang.IllegalArgumentException:Socket may not be null
  • fix: 在不设置ContentType和BodyType的情况下无法正常发送请求 (#I5CML4)
  • fix: ForestRequest.addBody(List) 循环中只执行一次

代码改动

  • refactor: 重构Cookie (#I5C26U)
  • refactor: 重构OkHttpClient
  • add: 添加拦截器到请求中方法ForestRequest#addInterceptor(Class<? extends Interceptor>)
  • add: HttpClientFactory
  • add: OkHttpClientFactory

特别鸣谢