声明式 HTTP 框架 Forest v1.5.21 发布!

来源: 投稿
作者: 公子骏
2022-05-20 15:25:00

Forest 介绍

Forest 是一个开源的 Java HTTP 客户端框架,它能够将 HTTP 的所有请求信息(包括 URL、Header 以及 Body 等信息)绑定到您自定义的 Interface 方法上,能够通过调用本地接口方法的方式发送 HTTP 请求

在 Gitee 上现已超过 2.4k star

Forest 如何使用

Forest 不需要您编写具体的 HTTP 调用过程,只需要您定义一个接口,然后通过 Forest 注解将 HTTP 请求的信息添加到接口的方法上即可。请求发送方通过调用您定义的接口便能自动发送请求和接受请求的响应

Forest 的工作原理

Forest 会将您定义好的接口通过动态代理的方式生成一个具体的实现类,然后组织、验证 HTTP 请求信息,绑定动态数据,转换数据形式,SSL 验证签名,调用后端 HTTP API (httpclient 等 API) 执行实际请求,等待响应,失败重试,转换响应数据到 Java 类型等脏活累活都由这动态代理的实现类给包了。 请求发送方调用这个接口时,实际上就是在调用这个干脏活累活的实现类

重点更新内容

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

任何包含特殊字符的URL地址或Body中的表单信息要发送请求,都要进过一定程度的UREncode以符合HTTP相关标准,才能正常发出请求

而HTTP请求中的不同部分对URLEncode强度要求是不同的,比如Body表单格式字符串的要求相对宽松,可以包含{,},空格等字符串,而Query参数值部分则必须将其转义才能正常发送

所以Forest在默认情况下为HTTP请求已经URL中的不同部分提供了各自合适的编码强度(最大限度宽松)的 URLEncode

但有些情况默认的URLEncode也无法满足要求:

  1. 不同服务端接口对编码的强度要求可能是不同的,比如要求Query参数必须是最严格的编码
  2. 已经如果在URL中大范围使用 ${变量名} 这样变量引用的时候,Forest也无法准备判断您引入的变量是URL中具体那个部分,从而也无法给出准确的编码强度
  3. 输入一个有歧义的字符串到字符串模板中

所以此时需要进行手动URLEncode,为此提供了在字符串模板中可供调用的内置函数:

  • encode(str): 严格编码,最大的编码强度
  • encodeQuery(str): Query参数编码,对URL中的参数值部分字符串进行编码,强度适中以最大限度适应HTTP规范
  • encodePath(str): Path路径编码,对URL中域名+后端+/ 后的路径部分字符串进行编码
  • encodeForm(str): Form表单编码,对Body中x-www-form-urlencoded格式的请求体字符串进行编码,强度最宽松
  • encodeUserInfo(str): UserInfo编码,对URL中用户名密码验证信息部分字符串进行编码

例子:

// 在{}中调用encode函数对userInfo变量进行严格URLEncode编码
@Get("http://{encode(userInfo)}@localhost:8080/hello/user")
ForestResponse<String> doGet(@Var("userInfo") String userInfo);
 

若调用该接口参数如下:

client.doGet("xxx/yyy/foo");
 

则产生的请求为:

GET http://xxx%2Fyyy%2Ffoo@localhost:8080/hello/user HTTP
 

如若不用 encode 函数的话,则请求会变成

GET http://xxx/yyy/foo@localhost:8080/hello/user HTTP
 

此时xxx/yyy/xxx中的/会使地址产生歧义,将xxx错误地解析为域名,显然这样的地址是无法正常发送出去的

 

文档和示例

本次更新

新增特性:

修复的问题:

展开阅读全文
15 收藏
分享
4 评论
15 收藏
分享
返回顶部
顶部
返回顶部
顶部