首页
开源
资讯
活动
开源许可证
软件工程云服务
软件代码质量检测云服务
持续集成与部署云服务
社区个性化内容推荐服务
贡献审阅人推荐服务
群体化学习服务
重睛鸟代码扫描工具
登录
注册
代码拉取完成,页面将自动刷新
Watch
319
Star
3.7K
Fork
770
dromara
/
forest
Fork 仓库
加载中
取消
确认
代码
Issues
148
Pull Requests
0
Wiki
0
统计
发行版
最新版
v1.6.2
ef372f1
2024-12-24 14:14
对比
v1.6.2
公子骏
Forest v1.6.1 版本发布了!此次版本更新主要修复了 JsonPath 和 SSE 相关问题,并新增了 SSE 的监听关闭接口。 #### 新增特性 - feat: 新增 ForestSSE.close() 监听关闭接口 - feat: 新增 ForestSSE.await() 用于阻塞等待异步监听完成 #### 修复问题 - fix: EventSource.close() 无法正常关闭 SSE 监听 - fix: 通过JsonPath获取基本类型字段错误
最后提交信息为:
fix: 通过JsonPath获取基本类型字段错误
v1.6.1
2b27382
2024-12-21 05:46
对比
v1.6.1
公子骏
Forest v1.6.1 版本发布了!此次版本更新主要修复了 SSE 相关问题,并新增了 SSE 拦截器。 #### SSE 拦截器 `ForestSSE`控制器和自定义SSE控制器都是非单例的独立实例对象,所以无法直接注入和使用 spring 上下文中的资源。 而 SSE 拦截器接口 SSEIntercpetor 继承自 Interceptor,可以注入到 spring 上下文中并使用其中的 bean,但和普通拦截器一样是单例,不能使用类属性共享数据。 ```java @Component public class MySSEInterceptor implements SSEInterceptor { @Override public void onSuccess(InputStream data, ForestRequest request, ForestResponse response) { // 和普通拦截器 onSuccess 相同,data 是 SSE 的消息流,不建议在这里动它 } @Override public void afterExecute(ForestRequest request, ForestResponse response) { // 和普通拦截器 afterExecute 相同 } @Override public void onSSEOpen(EventSource eventSource) { // SSE 开始监听时调用 } @Override public void onSSEClose(ForestRequest request, ForestResponse response) { // SSE 结束监听时调用 } // 监听名称为 data 的消息 @SSEDataMessage public void onData(ForestRequest request, @SSEName String name, @SSEValue String value) { // 参数列表中的参数个数不做限制,可随意排列组合 ForestRequest、ForestResponse、EventSource 这几个类型参数 // name: @SSEName 注解修饰的参数可传递 SSE 消息的名称 // value: @SSEValue 注解修饰的参数可传递 SSE 消息的值 } // 监听名称为 event 的消息 @SSEEventMessage public void onEvent(EventSource eventSource, @SSEValue String value) { // 参数列表中的参数个数不做限制,可随意排列组合 ForestRequest、ForestResponse、EventSource 这几个类型参数 } // 通过 @SSEMessage 注解可以指定要监听何种名称的消息 @SSEMessage("id") public void onData(EventSource eventSource) { // 参数列表中的参数个数不做限制,可随意排列组合 ForestRequest、ForestResponse、EventSource 这几个类型参数 } } ``` 绑定方式和普通拦截器一样 ```java @Get(url = "/sse", interceptor = MySSEInterceptor.class) ForestSSE testSSE_withInterceptor(); ``` #### 新增特性 - feat: SSE 拦截器 #### 修复问题 - fix: @SSEName 注解参数取值错误 - fix: SSE 请求长连接超时 - fix: SSE 请求返回的控制器为单例的问题 #### 代码改动 - update: SSE 适配 spring-boot 和 solon
最后提交信息为:
update: SSE 适配 spring-boot 和 solon
v1.6.0
e0f8ec3
2024-12-18 18:43
对比
v1.6.0
公子骏
Forest v1.6.0 版本发布了!此次版本更新功能较多,新增了包括 SSE、Jsonpath、链式条件函数等新特性。 #### 支持 SSE 此次最大的更新,主要是支持了 SSE,并且支持<b>声名式</b>和<b>编程式</b>两种 SSE 接口 ##### 声明式 SSE 接口: 接口定义: ```java public interface SSEClient { // Forest SSE 控制器类作为 SSE 接口返回类型 @Get("/sse") ForestSSE testSSE(); // 自定义 SSE 控制器类作为 SSE 接口返回类型 @Get("/sse") MySSEHandler testSSE2(); } ``` 自定义 SSE 控制器类: ```java public class MySSEHandler extends ForestSSE { @Override protected void onOpen(EventSource eventSource) { // SSE 开始监听时执行 } @Override protected void onClose(ForestRequest request, ForestResponse response) { // SSE 结束监听时执行 } @SSEDataMessage public void onHello(@SSEValue String value) { // 监听名称为 data 的消息事件 // @SSEValue 注解修饰的 value 参数为消息的值 } @SSEEventMessage(valueRegex = "\\{.*name.*\\}") public void onEvent(@SSEValue Contact contact) { // 监听名称为 event 的消息事件 // 并且消息要满足匹配正则表达式 "\\{.*name.*\\}" 的要求 } } ``` 接口调用: ```java // ForestSSE 作为返回值的接口调用 sseClient.testSSE().listen(); // 自定义 SSE 控制器作为返回值的接口调用 sseClient.testSSE().listen(); ``` ##### 编程式 SSE 接口: ```java Forest.get("http://localhost:{}/", server.getPort()) .sse() // 指定请求为 SSE 请求 .setOnOpen(eventSource -> { // SSE 开始监听时执行 }) .setOnClose((req, res) -> { // SSE 结束监听时执行 }) .addOnData((eventSource, name, value) -> { // 监听到名称为 data 的消息事件时执行 }) .addOnEventMatchesPrefix("close", (eventSource, name, value) -> { // 监听到名称为 event 的消息事件,并且消息的值满足"close"前缀匹配要求时执行 eventSource.close(); // 手动关闭 SSE 监听 }) .listen(); // 开始监听 ``` #### 支持链式条件函数 ```java Forest.get("http://localhost:{}", server.getPort()) .addHeader("A", 0) .cond(b > 100, q -> q.addHeader("B", 100)) // [单分支] 如果 b > 100,则添加 Header B:100 .cond(c > 200, q -> q.addHeader("C", 200)) // [单分支] 如果 c > 200,则添加 Header C:100 .ifThen(a > 0, q -> q.addHeader("A", a + 1)) // [多分支] 如果 a > 0,则添加 Header A:a+1 .elseIfThen(a == 0, q -> q.addHeader("A", 0)) // [多分支] 但如果 a = 0,则添加 Header A:0 .elseIfThen(a == -1, q -> q.addHeader("A", -1)) // [多分支] 但如果 a = -1,则添加 Header A:-1 .elseIfThen(a == -2, q -> q.addHeader("A", -2)) // [多分支] 但如果 a = -2,则添加 Header A:-2 .elseThen(q -> q.addHeader("A", 10)) // [多分支] 否则添加 Header A:10 .execute(); ``` #### 支持 JsonPath 声名式 JsonPath 注解 ```java public interface TestJSONPathClient { @Get("/test/user") @JSONPathResult("$.data") TestUser getSingleUser(); @Get("/test/user") @JSONPathResult("$.data") List<TestUser> getListOfUsers(); @Get("/test/user") @JSONPathResult("$.data[*].age") List<Integer> getListOfUserAges(); @Get("/test/user") @JSONPathResult("$.data[?(@.age>{minAge})].age") List<Integer> getListOfUserAges(@Var("minAge") int minAge); } ``` 编程式 JsonPath 接口 ```java TestUser user = Forest.get("http://localhost:{}/test/user", server.getPort()) .executeAsResponse() .getByPath("$.data", TestUser.class); ``` #### 安全流处理接口 ```java Forest.get("http://localhost:{}/download/test-img.jpg", server.getPort()) .executeAsStream((in, req, res) -> { // in 为已经打开的 InpuStream 流对象 // 在这里不需要手动打开和关闭流 }); ``` 大JSON数据的流式处理 ```java List<MyUser> list = Forest.get("http://localhost:{}/user.json", server.getPort()) .executeAsStream((in, req, res) -> { // 在回调函数返回的数据会作为请求的最终返回值 return new Gson() .fromJson(new JsonReader(new InputStreamReader(in)), MyUser.class) }); ``` #### 新增特性 - feat: 支持SSE - feat: 链式条件接口 - feat: 支持Jsonpath - feat: 字符串模板可以用 {} 替代 {数字} 作为参数占位符 - feat: 类级别`@BindingVar`注解 - feat: 适配Android环境的Log - feat: 新增 onResponse 生命周期回调函数 - feat: 支持 Optional 作为接口返回结果类型 - feat: 支持 CompletableFuture 作为接口返回结果类型 - feat: 自定义 LogHandler 支持 Spring Bean 方式注入 - feat: 美化字符串表达式报错信息 - feat: 新增安全响应流处理接口 #### 修复问题 - fix: 百分号无法被 URLEncode 的问题 - fix: @Address 注解的属性无法重写的问题 - fix: 过滤器函数无法调用 - fix: 可能出现的 connection pool shut down 问题 - fix: 在后端为okhttp3情况下,打印content-type为multiparty/form-data,body为其他类型时报错的问题 - fix: 在拦截器的onMethodInitialized方法中调用setReturnType函数无效(#I8PJ9R) - fix: 修复未恢复parentScope导致的栈溢出(#I9TP9Z) #### 代码改动 - update: 缓存框架换成Hutool的LRU缓存 - update: forest-solon-plugin 升级 solon 为:3.0.1(兼容 2.5.9+) - update: 更新依赖最新稳定版本 - refactor: 在发生 Response: [Network Error] 错误时,可以打印 status 信息 - opt: query支持线程安全 - reflector: 重构 ForestAuthenticator 接口 - refactor: 重构响应的流处理逻辑 - add: ResultGetter.openStream 方法 - refactor: 修改表达式异常报错信息格式 #### 贡献者 - @wittplus (witt) - @Kiroe (Kiro) - @noear_admin (西东)
最后提交信息为:
test: 安全响应流处理接口
v1.5.36
8712765
2024-02-27 10:59
对比
v1.5.36
公子骏
Forest v1.5.36 版本发布了!此次改动主要支持了 Fastjson2,以及 solon 版本更新 #### 新增特性 - feat: 支持 Fastjson2 #### 修复问题 - fix: okhttp 后端`response.getContentLength()`取不到值 (#I90MUX) - fix: Jackson转换器中Lazy转换Map出错 #### 代码改动 - Update: solon 升级为`v2.6.5` - refactor: 不在生成 multipart boundary 字符串时使用 okio 包的方法
最后提交信息为:
test: jackson兼容问题
v1.5.35
d211512
2023-11-29 11:08
对比
v1.5.35
公子骏
`v1.5.35`版本发布了!此次版本更新主要实现了后端客户端缓存可配置空间大小以及过期时间 #### 配置后端客户端缓存 配置缓存大小和过期时间 ```yaml forest: backend-client-cache-max-size: 512 # 后端客户端缓存最大空间大小(单位为实例个数,默认为128) backend-client-cache-expire-time: 3h # 后端客户端缓存超时时间(单位为时间长度,默认为6小时) ``` #### 新增特性: - feat: 后端客户端实例缓存可配置大小以及过期时间
最后提交信息为:
update: new version 1.5.35
v1.5.34
12e280b
2023-11-28 11:49
对比
v1.5.34
公子骏
`v1.5.34`版本发布了!此次更新为解决请求不同的域名很多时,内存消耗越来越大的问题,使用 Caffeine 缓存框架作为后端客户端缓存的缓存 #### 修复问题 - fix: 当请求不同的域名很多时,内存消耗越来越大 (#I8J5PN) - fix: 高并发环境下,监控runningPoolSize值,出现负值情况&且有时候所有请求都结束了,但值没有 归零 (#I8JNBU ) - fix:完善单元测试之修复声明式接口,`@BaseRequest`或`@BaseURL`,在有baseURL属性下,如果方法的完整URL不写端口,就会被baseURL属性的端口覆盖,并不是默认的80端口的bug - fix: 修复不管是是用`@Address`还是`@BaseRequest`都无法将baseUrl和`@Get()`中的url拼接在一起的bug (#I7CAYS) - fix:处理`@Addrees`注解中basePath已`/`结尾,方法url不以`/`开头,最终地址会出现`//`的bug。 - fix: MultipartRequestBody 类冲突 ([154](https://github.com/dromara/forest/issues/154)) #### 代码改动 - refactor: 将gson改为单例 - refactor: 去掉`@DownloadFile`注解在下载文件时的进度日志 - refactor: 将 forest-spring-boot3 的相关测试用例移动到 forest-test 下 #### 贡献者 - @CHMing - @wittplus - @Moonsets - @noear_admin - https://github.com/zhfish - https://github.com/galaxy-sea
最后提交信息为:
update: new version 1.5.34
v1.5.33
57377b3
2023-08-29 13:38
对比
v1.5.33
公子骏
Forest v1.5.33 发布了,此次版本更新主要支持了 Socks 协议的代理,以及组合注解的属性重写 #### 新增特性: - feat: 支持socks代理 (#I6MLMD) - feat: 组合注解支持属性重写 #### 修复问题: - fix: `@Body`注解的数组参数无法正常解析为JSON数组 (#I7UPBR) - fix: Content-Type为application/xml的情况下,发送byte数组数据错误 (#I7F3F0) - fix: `@JSONBody` Collection<String> codes 报错 (#I7QLTS) #### 代码改动: - add: `@SocksProxy`注解 - add: `@OverrideAttribute`注解 - opt: 优化URL更新方式 - update: forest-solon-plugin 升级 solon 为:2.4.0 #### 鸣谢: - forest-solon-plugin 升级 solon 为:2.4.0 由 @noear_admin 贡献 - 解决issure:#I7QLTS 由 @Angle94 贡献 #### 新特性如何使用: - Socks 代理的使用方式请看 [声明式Socks代理文档](https://forest.dtflyx.com/pages/1.5.33/proxy/#socks%E4%BB%A3%E7%90%86) 以及 [编程式Socks代理文档](https://forest.dtflyx.com/pages/1.5.33/api_proxy/#socks-%E5%8D%8F%E8%AE%AE%E6%AD%A3%E5%90%91%E4%BB%A3%E7%90%86) - 组合注解的属性重写请看 [文档](https://forest.dtflyx.com/pages/1.5.33/makeup_annotation/#%E5%B1%9E%E6%80%A7%E9%87%8D%E5%86%99)
最后提交信息为:
test: 1.5.33
v1.5.32
09eea86
2023-06-19 19:06
对比
v1.5.32
公子骏
v1.5.32 版本发布了!此次版本更新主要修复一些BUG。 #### 修复问题: - fix: 在`@Header`参数中传入 Lazy Lambda 出错 (#I7EIAB) - fix: URLEncoder 无法编码百分号字符 (134) #### 代码改动: opt: 异步线程池初始化时并发优化
最后提交信息为:
update: version 1.5.32
v1.5.31
10661bc
2023-04-26 01:36
对比
v1.5.31
公子骏
Forest v1.5.31 发布了!该版本是一个小版本发布,主要修复了一些BUG #### 新增特性 - feat: 所有 Forest 请求默认带上`User-Agent: forest/{version}`的请求头 #### 修复问题 - fix: maven中各模块的JDK版本控制 - fix: 不同 ForestConfiguration 产生的 Client 实例存在参数污染的情况 - fix: 当`@Address`注解的 schema 属性设置为 https 时报错 (#I6Y6E2) - fix: ReflectUtils.getFields非线程安全 (#I6W9TF) #### 代码改动 - opt: ForestMethod 使用懒加载的方式初始化 - refactor: 使用 revision 进行多模块版本管理 - refactor: 请求注解的 interceptor 属性只接受继承自 Interceptor 接口的类 - add: `Forest.VERSION`字段,可动态获取 Forest 版本号
最后提交信息为:
feat: 所有 Forest 请求默认带上 User-Agent: forest/version 的请求头
v1.5.30
dbff4be
2023-03-08 16:21
对比
v1.5.30
公子骏
`v1.5.30`版本发布了,这次版本更新有了较大的改动,支持和适配了 SpringBoot3 和 Solon 框架,将XML模块拆分出了主模块,以及新增了延迟参数特性 #### 适配 SpringBoot3 项目中新增了`forest-spring-boot3-starter`模块,集成时需引入如下的依赖 ```xml <!-- 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`模块,集成时需引入如下的依赖 ```xml <!-- 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`依赖 ```xml <!-- Forest 的 JAXB 支持模块 --> <dependency> <groupId>com.dtflys.forest</groupId> <artifactId>forest-jaxb</artifactId> <version>1.5.30</version> </dependency> ``` 如果您的项目是 SpringBoot3,或是 JDK 17及以上版本的项目,这选择`forest-jakarta-xml`依赖 ```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做加密的结果) - 请求头的延迟参数 ```java 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(); ``` - 请求体的延迟参数 ```java 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 适配上的支持
最后提交信息为:
fix: 无法解析 localhost 这类省略 http:// 的 url
v1.5.28
3ed96a2
2022-11-22 11:50
对比
v1.5.28
公子骏
v1.5.28版本发布了,此次版本发布是小版本更新,主要是修复一些BUG,并添加了`onBodyEncode`拦截器回调函数 #### 新增特性 - feat: 拦截器新增 onBodyEncode 回调函数 (#I4WF5Q) - feat: 隐式转换带 BasicAuth 认证信息的请求 (#I62BTW) - feat: 声明式接口可返回 `ForestFuture<T>` 类型 #### 修复问题 - fix: 下载文件,从URL中取得文件名时前后双引号的问题 (#I61NPK) - fix: 参数为空,导致空指针问题 ([110](https://github.com/dromara/forest/issues/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() 结果不正确 #### 特别鸣谢 - @idevmo
最后提交信息为:
update: new version -> 1.5.28
v1.5.27
8b29dc5
2022-11-10 15:47
对比
v1.5.27
公子骏
`v1.5.27`版本发布了,此次版本发布除了修复一些BUG,另外还支持了 Kotlin 的协程,并且增强了异步请求的API和获取响应数据的API #### 新增特性 - feat: 异步API增强, 支持 Async/Await 风格 (#I60IAL) - feat: 响应API增强, 后验数据转换 (#I60IDO) - feat: kotlin协程 - feat: 请求可中断取消执行 (#I60I90) #### 修复问题 - fix: ForestHeaderMap.addCookie时可能会存在无法进入header的问题 ([100](https://github.com/dromara/forest/issues/100)) - fix: 发送 multipart/form-data 请求时,`@Body`参数为空会报错 (#I5Y7WJ ) - fix: 未设置 charset 时,调用 ForestRequest.getQueryString() 报错 (#I5RGX4 ) - fix: ForestRequest.getBasePath() 无法获取 AddressSource 中定义的 basePath (#I5RGOY ) - fix: x-www-form-urlencoded 格式请求 Body 在 URLEncode 时忽略 `#` - fix: 在重试的时候没有关闭上一次的请求响应 #### 特别鸣谢 - @CHMing - [@yangle94](https://github.com/yangle94)
最后提交信息为:
comment: 修改注释以符合Javadoc规范
v1.5.26
0816ec6
2022-08-08 10:38
对比
v1.5.26
公子骏
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`
最后提交信息为:
update: new version 1.5.26
v1.5.25
45e7057
2022-07-18 13:30
对比
v1.5.25
公子骏
Forest `v1.5.25` 版本发布了! #### 修复的问题 - fix: 匹配验证secure cookie - fix: cookie携带请求不成功 (#I5F8IY) - fix: OKHTTP 连接泄漏问题 (#I5E613) - fix: forest 支持springboot 1.5.14.realese 启动失败 (#I5FDBG) - fix: 传的参数带有+号,但是服务接收时,获取的参数值中+号全部变成空格了 (#I5EG9L) #### 其它改动 - 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
v1.5.24
e15ccc9
2022-06-27 12:20
对比
v1.5.24
公子骏
Forest v1.5.24 版本发布了!此次版本更新主要解决一些BUG #### BUG修复 - fix: OKHTTP 连接泄漏问题 (#I5E613) - fix: 遇到无法解析的Cookie时会报空指针 (#I5E27R)
最后提交信息为:
update: new version 1.5.24
v1.5.23
25cfd0c
2022-06-21 00:54
对比
v1.5.23
公子骏
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 #### 特别鸣谢 - @CHMing - @tanglinyan
最后提交信息为:
update: 去掉不用的import
v1.5.22
bf3bd5f
2022-06-08 11:38
对比
v1.5.22
公子骏
`1.5.22`版本发布了!本次更新主要解决了统一连接池问题,并开始支持Kotlin,兼容4.x等较低的spring版本 #### 主要更新内容 ##### 统一连接池 以前版本的 `max-connections` 和 `max-route-connections` 配置属性是针对 OkHttp3 和 HttpClient 后端框架连接池的设置,这样使得不同后端的请求在不同的连接池中,而后端的连接池相互隔离,无法形成统一的最大连接数的限制 而且 OkHttp3 的请求数限制是放在 Dispatcher 中的,而不是在连接池中,而 Dispatcher 直接绑定在了 OkHttpClient 对象上,所以很难对其进行设置和管理,基本上 `max-connections` 和 `max-route-connections` 属性对 OkHttp3 是无效的,等于是设置了个寂寞。 而本次更新的统一连接池,可以通过`max-connections` 和 `max-route-connections`属性统一管理 OkHttp 和 HttpClient 所有后端的所有请求的最大请求数和最大每路由请求数,同时也包括异步请求在内可以一同进行限制 ##### 参数定义返回类型 新增@Return参数注解,来标识某个参数为返回类型 ```java /** * 通过 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) - feat: 可配置异步请求线程池队列大小 (#I5B78X) - feat: 支持通过参数定义返回类型 (#I5ANZL) #### 修复问题 - fix: spring 5.1 以下的低版本启动失败 - fix: 请求地址中包含#字符会被转义导致资源找不到 (#I59O7M) - fix: 配置BaseRequest的baseURL属性后,完整请求路径中的默认端口号会被覆盖,导致请求失败 (#I4YBDV) - fix: 解决当@body注解在对象上标识以后,char&Character类型的属性无法从客户端传输至服务端问题 - fix: kotlin项目启动异常 (#I50PDZ) - fix: RetryWhen重试条件接口在最后一次重试后会执行两次 (#I599BT) #### 其它改动 - update: #I5ANZR 删除单元测试代码中的Log4j2依赖 #### 特别鸣谢 本次更新参与贡献的小伙伴 - @fangzhengjin - @xiao4852
最后提交信息为:
feat:
#I5APJA
统一连接池
v1.5.21
6554a01
2022-05-20 02:19
对比
v1.5.21
公子骏
`v1.5.21`版本发布了! 此次版本发布主要解决了URL在某些情况下的解析错误问题,以及对字符串模板进行手动URLEncode的支持 #### 新增特性 - feat: 字符串模板支持手动URLEncode (#I58D1C) #### 修复的BUG - fix: url在某些场景下的解析错误 (#I56XDM)
最后提交信息为:
fix: query url encode
v1.5.20
db8481a
2022-05-05 06:49
对比
v1.5.20
公子骏
`v1.5.20`版本发布了,中间因为有其它事情所以停滞了一段时间,还好有其他小伙伴的支持,为此间的版本升级,尤其是JDK 17的兼容做了很多工作,特此感谢。此次版本升级,以支持新版本JDK为主,包括从8到17的所有版本基本都可以兼容(主要测了较为主流的11和17,8不必说,原本就支持) #### 新特性 - feat: 支持JDK17,兼容从8、11到17所有JDK版本 #### 修复问题 - fix: BaseRequest 设置connectTimeout和readTimeout没效果(#I4Z8Y0) - fix: 下载,内存溢出(#I4NFPE) - fix: AddressSource 里面配置 basePath 不生效(#I50LVA) #### 特别鸣谢 - @CHMing
最后提交信息为:
update: 1.5.20
v1.5.19
6535d6e
2022-02-21 16:41
对比
v1.5.19
公子骏
`v1.5.19`版本发布了,此次更新主要修复了一些BUG #### 修复的问题: - fix: 在原生Spring环境中,拦截器无法注入Spring上下文 (#I4UE9T) - fix: httpclient后端的https连接池并发时数据会串 (#I4TYJ1) - fix: 响应头两个 Set-Cookie 的时候只能取到最后一个 (#I4TATV) #### 其它改动: - refactor: 去掉 commons-logging 包的依赖
最后提交信息为:
update: new version 1.5.19
下载
请输入验证码,防止盗链导致资源被占用
取消
下载