313 Star 3.4K Fork 728

dromara / forest

2024-02-27 10:59
1216742 dt flys 1594991700 公子骏

Forest v1.5.36 版本发布了!此次改动主要支持了 Fastjson2,以及 solon 版本更新

新增特性

  • feat: 支持 Fastjson2

修复问题

代码改动

  • Update: solon 升级为v2.6.5
  • refactor: 不在生成 multipart boundary 字符串时使用 okio 包的方法
最后提交信息为: test: jackson兼容问题
2023-11-29 11:08
1216742 dt flys 1594991700 公子骏

v1.5.35版本发布了!此次版本更新主要实现了后端客户端缓存可配置空间大小以及过期时间

配置后端客户端缓存

配置缓存大小和过期时间

forest:
  backend-client-cache-max-size: 512      # 后端客户端缓存最大空间大小(单位为实例个数,默认为128)
  backend-client-cache-expire-time: 3h    # 后端客户端缓存超时时间(单位为时间长度,默认为6小时)

新增特性:

  • feat: 后端客户端实例缓存可配置大小以及过期时间
最后提交信息为: update: new version 1.5.35
2023-11-28 11:49
1216742 dt flys 1594991700 公子骏

v1.5.34版本发布了!此次更新为解决请求不同的域名很多时,内存消耗越来越大的问题,使用 Caffeine 缓存框架作为后端客户端缓存的缓存

修复问题

代码改动

  • refactor: 将gson改为单例
  • refactor: 去掉@DownloadFile注解在下载文件时的进度日志
  • refactor: 将 forest-spring-boot3 的相关测试用例移动到 forest-test 下

贡献者

最后提交信息为: update: new version 1.5.34
2023-08-29 13:38
1216742 dt flys 1594991700 公子骏

Forest v1.5.33 发布了,此次版本更新主要支持了 Socks 协议的代理,以及组合注解的属性重写

新增特性:

修复问题:

代码改动:

  • add: @SocksProxy注解
  • add: @OverrideAttribute注解
  • opt: 优化URL更新方式
  • update: forest-solon-plugin 升级 solon 为:2.4.0

鸣谢:

新特性如何使用:

最后提交信息为: test: 1.5.33
2023-06-19 19:06
1216742 dt flys 1594991700 公子骏

v1.5.32 版本发布了!此次版本更新主要修复一些BUG。

修复问题:

代码改动:

opt: 异步线程池初始化时并发优化

最后提交信息为: update: version 1.5.32
2023-04-26 01:36
1216742 dt flys 1594991700 公子骏

Forest v1.5.31 发布了!该版本是一个小版本发布,主要修复了一些BUG

新增特性

  • feat: 所有 Forest 请求默认带上User-Agent: forest/{version}的请求头

修复问题

代码改动

  • opt: ForestMethod 使用懒加载的方式初始化
  • refactor: 使用 revision 进行多模块版本管理
  • refactor: 请求注解的 interceptor 属性只接受继承自 Interceptor 接口的类
  • add: Forest.VERSION字段,可动态获取 Forest 版本号
2023-03-08 16:21
1216742 dt flys 1594991700 公子骏

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没有效果 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 适配上的支持

2022-11-22 11:50
1216742 dt flys 1594991700 公子骏

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

新增特性

修复问题

特别鸣谢

最后提交信息为: update: new version -> 1.5.28
2022-11-10 15:47
1216742 dt flys 1594991700 公子骏

v1.5.27版本发布了,此次版本发布除了修复一些BUG,另外还支持了 Kotlin 的协程,并且增强了异步请求的API和获取响应数据的API

新增特性

修复问题

特别鸣谢

2022-08-08 10:38
1216742 dt flys 1594991700 公子骏

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

新增特性

修复问题

其它改动

  • update: 更新 spring 版本到5.3.19
  • update: 更新 spring boot 版本到2.6.7
最后提交信息为: update: new version 1.5.26
2022-07-18 13:30
1216742 dt flys 1594991700 公子骏

Forest v1.5.25 版本发布了!

修复的问题

其它改动

  • add: OkHttp3Cookie
  • add: HttpclientCookie
  • update: 更新jackson版本到2.13.3
  • update: 更新jackson-databind版本到2.13.3
  • update: 更新jackson-annotations版本到2.13.3
  • update: 更新gson版本到2.8.9
  • update: 更新fastjson版本到1.2.83
最后提交信息为: update: 更新jackson版本到2.13.3
2022-06-27 12:20
1216742 dt flys 1594991700 公子骏

Forest v1.5.24 版本发布了!此次版本更新主要解决一些BUG

BUG修复

最后提交信息为: update: new version 1.5.24
2022-06-21 00:54
1216742 dt flys 1594991700 公子骏

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

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

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

优化内容

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

新增特性

BUG修复

代码改动

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

特别鸣谢

最后提交信息为: update: 去掉不用的import
2022-06-08 11:38
1216742 dt flys 1594991700 公子骏

1.5.22版本发布了!本次更新主要解决了统一连接池问题,并开始支持Kotlin,兼容4.x等较低的spring版本

主要更新内容

统一连接池

以前版本的 max-connectionsmax-route-connections 配置属性是针对 OkHttp3 和 HttpClient 后端框架连接池的设置,这样使得不同后端的请求在不同的连接池中,而后端的连接池相互隔离,无法形成统一的最大连接数的限制

而且 OkHttp3 的请求数限制是放在 Dispatcher 中的,而不是在连接池中,而 Dispatcher 直接绑定在了 OkHttpClient 对象上,所以很难对其进行设置和管理,基本上 max-connectionsmax-route-connections 属性对 OkHttp3 是无效的,等于是设置了个寂寞。

而本次更新的统一连接池,可以通过max-connectionsmax-route-connections属性统一管理 OkHttp 和 HttpClient 所有后端的所有请求的最大请求数和最大每路由请求数,同时也包括异步请求在内可以一同进行限制

参数定义返回类型

新增@Return参数注解,来标识某个参数为返回类型

    /**
     * 通过 Class 类型参数来标识返回类型
     * 
     * @param clazz 返回类型
     * @return clazz 参数所标识的返回类型的实例
     * @param <T> 未知泛型参数,通过传入 clazz 参数来明确泛型的实际类型
     */
    @Get("/")
    <T> T getGenericClass(@Return Class<T> clazz);

    /**
     * 通过 Type 类型参数来标识返回类型
     * 
     * @param type 返回类型
     * @return type 参数所标识的返回类型的实例
     * @param <T> 未知泛型参数,通过传入 type 参数来明确泛型的实际类型
     */
    @Get("/")
    <T> T getGenericType(@Return Type type);

    /**
     * 通过 TypeReference 类型参数来标识返回类型
     * 
     * @param typeReference 返回类型
     * @return typeReference 参数所标识的返回类型的实例
     * @param <T> 未知泛型参数,通过传入 typeReference 参数来明确泛型的实际类型
     */
    @Get("/")
    <T> T getGenericTypeReference(@Return TypeReference<T> typeReference);

新增特性

修复问题

其它改动

特别鸣谢

本次更新参与贡献的小伙伴

最后提交信息为: feat: #I5APJA统一连接池
2022-05-20 02:19
1216742 dt flys 1594991700 公子骏

v1.5.21版本发布了!

此次版本发布主要解决了URL在某些情况下的解析错误问题,以及对字符串模板进行手动URLEncode的支持

新增特性

修复的BUG

最后提交信息为: fix: query url encode
2022-05-05 06:49
1216742 dt flys 1594991700 公子骏

v1.5.20版本发布了,中间因为有其它事情所以停滞了一段时间,还好有其他小伙伴的支持,为此间的版本升级,尤其是JDK 17的兼容做了很多工作,特此感谢。此次版本升级,以支持新版本JDK为主,包括从8到17的所有版本基本都可以兼容(主要测了较为主流的11和17,8不必说,原本就支持)

新特性

  • feat: 支持JDK17,兼容从8、11到17所有JDK版本

修复问题

特别鸣谢

最后提交信息为: update: 1.5.20
2022-02-21 16:41
1216742 dt flys 1594991700 公子骏

v1.5.19版本发布了,此次更新主要修复了一些BUG

修复的问题:

其它改动:

  • refactor: 去掉 commons-logging 包的依赖
最后提交信息为: update: new version 1.5.19
2022-02-09 14:10
1216742 dt flys 1594991700 公子骏

v1.5.17版本发布了,本次更新主要修复以往的BUG,以及新增了动态正向代理来源信息的功能

新增特性:

feat: 动态正向代理来源信息 (#I4SYM1:动态正向代理来源信息)

修复问题:

fix: 异常:The file of SSL KeyStore is empty (#I4SYGB:异常:The file of SSL KeyStore is empty)
fix: maxRetryInterval配置失效 (#I4SV2P:maxRetryInterval配置失效)
fix: 主项目没有依赖lang3会报错的问题 (#I4M9DE:主项目没有依赖lang3会报错的问题)
fix: 组合注解未生效 (#I4N2HC:组合注解未生效)

其它改动:

refactor: 去掉 NameUtils 工具类中重复的if分支

特别鸣谢:

@chming

最后提交信息为: update: new version 1.5.17
2021-12-09 14:34
1216742 dt flys 1594991700 公子骏

1.5.15版本发布了,本次添加了自定义SSL主机名验证器,以及修复了Response字符编码和gzip解压等问题

Forest已参加2021年度OSC中国开源项目评选活动,如果您喜欢Forest或对Forest感兴趣,请投上您宝贵的一票,感谢!
点击投票👉 投票

重点更新内容

自定义hostnameVerifier

定义一个实现 HostnameVerifier 接口的类

/**
 * 自定义SSL主机名/域名验证器
 */
public class MyHostnameVerifier implements HostnameVerifier {
    @Override
    public boolean verify(String s, SSLSession sslSession) {
        if ("gitee.com".equals(s)) {
            return true;
        }
        return false;
    }
}

将自定义的SSL主机名验证器配置到 Forest 的KeyStore

在Springboot项目的application.yml文件中配置
forest:
  ssl-key-stores:
    - id: keystore1
      hostname-verifier: your.site.MyHostnameVerifier

在接口中绑定

@Post(url = "/something", keyStore = "keystore1")
String postSomething(@Body body);

@SSLHostnameVerifier注解

除了在全局配置文件中的keyStore中配置外, 也可以通过相关注解直接在接口上绑定

public class MyHostnameVerifier implements HostnameVerifier {
    @Override
    public boolean verify(String hostname, SSLSession session) {
        // 只通过域名为 gitee.com 的请求
        if ("gitee.com".equals(hostname)) {
            return true;
        }
        return false;
    }
}

通过@SSLHostnameVerifier注解绑定到接口

@Post(url = "/something")
@SSLHostnameVerifier(TrustAnyHostnameVerifier.class)
String postSomething(@Body body);

@SSLSocketFactoryBuilder注解

同理 SSLSocketFactory 也一样可以自定义,同时由@SSLSocketFactoryBuilder注解来绑定

public class MySSLSocketFactoryBuilder implements SSLSocketFactoryBuilder {

    @Override
    public SSLSocketFactory getSSLSocketFactory(ForestRequest request, String protocol) throws Exception {
        SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null,
                new TrustManager[] { new TrustAllManager() },
                new SecureRandom());
        System.out.println("do MySSLSocketFactoryBuilder");
        return sslContext.getSocketFactory();
    }
}

绑定到接口

@Post(url = "/something")
@SSLSocketFactoryBuilder(MySSLSocketFactoryBuilder.class)
String postSomething(@Body body);

更新日志

新增特性

修复问题

代码更新

  • add: @SSLHostnameVerifier 注解
  • add: @SSLSocketFactoryBuilder 注解

鸣谢

本次更新有 @AlexShi 小伙伴参与贡献,万分感谢!

2021年度OSC中国开源项目评选

Forest已参加2021年度OSC中国开源项目评选活动,如果您喜欢Forest或对Forest感兴趣,请投上您宝贵的一票,感谢!

点击投票👉 投票

2021-12-01 14:30
1216742 dt flys 1594991700 公子骏

v1.5.14版本发布!此次版本发布主要解决了异步线程池大小设置问题,以及URL中@字符解析问题

新增特性

修复问题

代码改动

  • add: AsyncAbortPolicy类
  • add: ForestBody.nameValuesMapWithObject

优化内容

  • optimize: @Backend注解解析过程
最后提交信息为: add: ForestBody.nameValuesMapWithObject
Java
1
https://gitee.com/dromara/forest.git
git@gitee.com:dromara/forest.git
dromara
forest
forest

搜索帮助