Forest 介绍
Forest 是一个开源的声明式 Java HTTP 客户端框架,它能够将 HTTP 的所有请求信息(包括 URL、Header 以及 Body 等信息)绑定到您自定义的 Interface 方法上,能够通过调用本地接口方法的方式发送 HTTP 请求
Forest 如何使用
Forest 不需要您编写具体的 HTTP 调用过程,只需要您定义一个接口,然后通过 Forest 注解将 HTTP 请求的信息添加到接口的方法上即可。请求发送方通过调用您定义的接口便能自动发送请求和接受请求的响应
Forest 的工作原理
Forest 会将您定义好的接口通过动态代理的方式生成一个具体的实现类,然后组织、验证 HTTP 请求信息,绑定动态数据,转换数据形式,SSL 验证签名,调用后端 HTTP API (httpclient 等 API) 执行实际请求,等待响应,失败重试,转换响应数据到 Java 类型等脏活累活都由这动态代理的实现类给包了。 请求发送方调用这个接口时,实际上就是在调用这个干脏活累活的实现类
获得奖项
2021 年度 OSC 中国开源项目评选「最受欢迎项目」
https://www.oschina.net/project/top_cn_2021
重点优化内容
- 引入了 ForestRoute 路由的概念,每个 Host + Port 的不同组合对应不同的路由
- 将 OkHttpClient 以及 HttpClient 后端 Client 对象归类到不同的路由,并进行缓存
- 可以从外部注入自定义的后端 Client 对象
- 默认都会缓存后端 Client 对象,同路由、同SSL、同超时间情况下都会复用同一个 Client 对象
- 如某个接口不想缓存 Client 对象,可通过
@BackendClient
注解进行配置
优化结果
OkHttp后端QPS提升3倍,Httpclient后端QPS提升1倍
本次更新
新增特性:
- feat: 快速接口支持快速下载文件
- feat: 可配置注入OkHttpClient和HttpClient对象 (#I5CWAL:可配置注入OkHttpClient和HttpClient对象)
- feat: 可配置接口的后端Client对象是否缓存 (#I5D818:可配置接口的后端Client对象是否缓存)
BUG修复:
- fix: springboot配置binary转换器初始化失败 (#I5D07S:springboot配置binary转换器初始化失败)
- fix: ForestResponse.statusIs(xxx)会出现空指针 (#I5CWQL:ForestResponse.statusIs(xxx)会出现空指针)
- fix: 在@Address注解的basePath中写的端口号会失效 (#I5CR15:在@Address注解的basePath中写的端口号会失效)
- fix: 使用@HTTPProxy注解对https请求设置http代理后出现java.lang.IllegalArgumentException:Socket may not be null
- fix: 在不设置ContentType和BodyType的情况下无法正常发送请求 (#I5CML4:在不设置ContentType和BodyType的情况下无法正常发送请求)
- fix: ForestRequest.addBody(List) 循环中只执行一次
代码改动
- refactor: 重构Cookie (#I5C26U:重构Cookie)
- refactor: 重构OkHttpClient
- add: 添加拦截器到请求中方法ForestRequest#addInterceptor(Class<? extends Interceptor>)
- add: HttpClientFactory
- add: OkHttpClientFactory