Skip to content

v1.7.1

Latest
Compare
Choose a tag to compare
@mySingleLive mySingleLive released this 24 Jun 05:31
· 29 commits to master since this release

Forest v1.7.1 版本发布了!本次发布包含了很多重大更新内容,我们对字符串模板的语法进行了增强,支持了空安全语法和深度变量引用,并提供了更友好的报错信息;在Cookie方面也进行了增强,提供了Cookie自动保存和读取的机制,并添加了更完善的API接口;我们也对拦截器进行了优化改进,不再建议直接使用Interceptor接口和它的onSuccess方法,取而代之的是ForestInterceptoronResponse方法,它们要比前者更安全,性能也更好;除此之外,此次更新对请求的性能进行了全面的优化,在默认使用编程式接口、不打印日志的情况下,可以达到和 hutool 的 HttpUtil 差不多的耗时。

空安全语法

在原来版本,如果在字符串模板中引用一个没定义过的变量会支持报错。现在用空安全语法可以让它不再报错,而是直接返回 null 值。

// 没定义过 testVar 变量,通过 ? 一样可以正常引用
Forest.get("/test/{testVar?}");

或者,引用了一个不存在或值为 null 的变量后,再用点.访问它的属性,这在老版本中自然是直接报错的。现在,可以通过?.符号自动判断是否为空。

// 会先判断 testVar 是否为空,然后 testVar.a 是否为空,其中一个为空就会直接返回 null
// 不会报错
Forest.get("/test/{testVar?.a?.name}");

深度引用

在原来版本中,字符串模板中的变量只能引用到第一层,如果该变量的值是引用其他的变量,字符串模板并不会进行解析。而现在,不管引用了多少层变量,都可以解析到底。

forest:
  variables:
    var1: "{user.name}"
    var2: "{user.password}"
    user:
      name: foo
      password: bar

在Java代码中直接引用

// 最终 URL 为: /test/foo/bar
Forest.get("/test/{var1}/{var2}");

如果不想进行深度引用,可以使用深度引用停止语法,即在变量后加上!符号,那么就只会引用一层该变量的值,至于该变量的值是否会包含其他字符串模板的内容,就不会再进行解析了。

// 最终 URL 为: /test/{user.name}/{user.password}
// 变量 var1 和 var2 的值直接返回字符串,而不会进行任何解析
Forest.get("/test/{var1!}/{var2!}");

更安全的拦截器

本次版本更新后,不再建议使用Interceptor(当然要用也可以用,不影响以前的老代码),同时引入了更安全的ForestInterceptor接口

public class MyInterceptor implements ForestInterceptor {


    @Override
    public ResponseResult onResponse(ForestRequest request, ForestResponse response) {
        if (response.isError()) {
            // 返回错误标志
            return error(response.getException());
        }
        // 通过 response.getResult() 或 response.get(数据类型.class) 来获取响应数据

        // 返回继续执行标志
        return proceed();
    }
}

请求级别日志开关

不再需要 new 一个 LogConfiguration 对象,直接在 ForestRequest 的链式调用中即可设置日志开关

Forest.post("/test")
        .logEnabled(true) // 请求日志总开关
        .logRequest(true) // 请求内容日志开关
        .logResponseStatus(true) // 响应状态日志开关
        .logResponseHeaders(true) // 响应头日志开关
        .logResponseContent(false) // 响应体内容日志开关
        .execute();

新增特性

  • feat: 字符串模板支持空安全语法
  • feat: 更友好的字符串模板错误消息
  • feat: 字符串模板{${等符号支持转义\\{\\${
  • feat: 字符串模板支持深度变量引用
  • feat: 字符串模板支持停止深度引用的语法
  • feat: 支持嵌套字符串模板
  • feat: 新增更安全的 Forest 拦截器接口 ForestInterceptor
  • feat: 通过配置自定义异步线程池拒绝策略
  • feat: 支持Bear 认证器
  • feat: 支持@Var作为方法和类的变量绑定注解
  • feat: 新增 ForestRequest 级别的日志开关接口
  • feat: 增强 Cookie 相关 API 接口
  • feat: 后台自动清理过期 Cookie
  • feat: 支持 Cookie 自动化存取机制

修复错误

  • fix: 和老版本forest冲突时,新版本Forest类缺乏get(url)、post(url)等方法签名,造成错误 (#IC7LIH)
  • fix: body log在部分环境中文乱码
  • fix: 修改接口中常量的命名,避免用户在其与只有大小写区别的方法之间产生混淆

重构内容

  • refactor: 重构URL解析过程
  • refactor: 重构变量作用域
  • refactor: 重构 Forest 变量体系
  • refactor: ForestCookie 不再依赖 OkHttp
  • refactor: ForestCookie.parse() 接口
  • refactor: 添加键值对类型请求体删除接口 ForestBody.removeNameValueBody

代码优化

  • optimize: 优化请求性能
  • optimize: 根据 Response 类型动态判断响应是否自动关闭
  • optimize: 默认后端改为 httpclient
  • optimize: 拦截器优化