Forest介绍
Forest 是一个开源的 Java HTTP 客户端框架,它能够将 HTTP 的所有请求信息(包括 URL、Header 以及 Body 等信息)绑定到您自定义的 Interface 方法上,能够通过调用本地接口方法的方式发送 HTTP 请求
获得奖项
-
2021 年度 OSC 中国开源项目评选「最受欢迎项目」
-
2022 年度 OSC 中国开源项目评选「最火热中国开源项目社区」
简单的栗子
-
声明式接口
创建一个 interface,并用@Get
注解修饰接口方法。
public interface MyClient {
@Get("http://localhost:8080/hello")
String hello();
}
通过@Get
注解,将上面的 MyClient 接口中的simpleRequest()
方法绑定了一个 HTTP 请求, 其 URL 为http://localhost:8080/hello
,并默认使用 GET 方式,且将请求响应的数据以 String 的方式返回给调用者
-
编程式接口
Forest.get("http://localhost:8080/hello").execute();
编程式接口则更为简单直接
v1.5.33 新增特性
-
增强自定义注解组合
-
支持Socks代理
增强自定义注解组合
组合注解是 Forest 提供的自定义注解的一种方式,这种方式只需定义注解自身,已经绑定上需要组合的注解即可,相比通过需要自定义注解声明周期的方式,要方便快捷不少
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
// 组合Header注解
@Headers("Content-Type: application/json")
// 组合Address注解
@Address(host = "127.0.0.1", port = 80)
public @interface MySite {
// 自定义的 @MySite 注解
}
此时使用自定义的@MySite
的注解,就相当于加上了Content-Type: application/json
头和host = "127.0.0.1", port = 80
的根地址
// @MySite 等价于
// @Header("Content-Type: application/json") + @Address(host = "127.0.0.1", port = 80)
@MySite
public interface MyClient {
// ... ...
}
如果你想更灵活一点,想为@@MySite
注解添加host
和port
属性,并覆盖@Address
注解的host
和port
属性,这些以前版本是做不到的,而 v1.5.33 版本可以
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
// 加上 @RequestAttributes 注解才能解析注解中定义的属性
@RequestAttributes
// 组合Header注解
@Headers("Content-Type: application/json")
// 组合Address注解
@Address
public @interface MySite {
// 重写 @Address 注解的 host 属性
@OverrideAttribute
String host();
// 重写 @Address 注解的 port 属性
@OverrideAttribute
int port();
}
此时就可以通过@MySite
注解的host
和port
属性从外部传入根地址信息了
@MySite(host = "127.0.0.1", port = 80)
public interface MyClient {
// ... ...
}
Socks协议代理
在以前版本也可以实现 Socks 代理功能,但需要自定义后端的 OkHttpClient 对象或 Apache 的 HttpClient 对象,然后还要后端HTTP框架的 Client 对象绑定自定义的 Socket Connection 部分代码,非常的麻烦。如果再加上 SSL 和用户验证的需求,那更是烦上加烦
而此次 Forest 直接支持了 Socks 协议代理,分别为声明式接口和编程式接口提供了友好的 Api,让事情变成原本就该有的简单
声明式 Socks 代理
只要加上@SocksProxy
注解,并填上host
和port
就能轻松实现 Socks 代理
@Post("http://localhost:8080/hello")
@SocksProxy(host = "127.0.0.1", port = "1089")
String simplePostWithSocksProxy();
加上用户密码验证也十分简单
@Post("http://localhost:8080/hello")
@SocksProxy(host = "127.0.0.1", port = "1089", username = "root", password = "xxxxxx")
String simplePostWithSocksProxy();
编程式 Socks 代理
通过静态方法ForestProxy.socks
即可快速构建 Socks 协议代理
ForestProxy proxy = ForestProxy.socks("127.0.0.1", 3128);
加上用户密码验证
ForestProxy proxy = ForestProxy.socks("127.0.0.1", 3128)
.username("foo") // 验证用户名
.password("bar"); // 验证密码
官网和仓库地址
官网地址:
http://forest.dtflyx.com
Gitee 仓库地址:
https://gitee.com/dromara/forest
Github 仓库地址:
https://github.com/dromara/forest
本次更新内容
feat: #I6MLMD 支持socks代理
feat: 组合注解支持属性重写
fix: #I7UPBR @Body注解的数组参数无法正常解析为JSON数组
fix: #I7F3F0 Content-Type为application/xml的情况下,发送byte数组数据错误
fix: #I7QLTS @JSONBody Collection codes 报错
add: SocksProxy 注解
add: OverrideAttribute 注解
opt: 优化URL更新方式
update: forest-solon-plugin 升级 solon 为:2.4.0