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
新增特性
Async/Await 接口
自 Ajax 流行开始,回调函数的异步处理方式就已经深入人心,这种方法虽好,但也有不少问题
比如回调地狱:很容易写出在A请求的回调函数中调用B请求,然后在B请求的回调函数中调用C请求,这样的套娃代码
另一个问题,就是执行回调函数所在的线程和调用接口的线程并非同一个线程,这就会引入并发和锁的问题,处理的时候需要谨慎对待
为了解决这些问题,需引入 Async/Await 方式
MyUser result = Forest.get("/foo") // 创建 GET 请求 .async() // 设置为异步 .executeAsFuture() // 发送请求,并返回 ForestFuture 对象 .await() // 阻塞线程并等待请求响应,成功响应后会返回 ForestResponse 对象 .get(MyUser.class); // 调用 ForestResponse 的 get 方法进行转换数据并返回结果
同时发送和接受多个异步请求
ForestFuture f1 = Forest.get("/foo") // 创建第一个 GET 请求 .async() // 设置为异步 .addQuery("id", 0) // 设置 Query 参数 .executeAsFuture(); // 发送请求并返回 ForestFuture 对象 ForestFuture f2 = Forest.get("/bar") // 创建第二个 GET 请求 .async() // 设置为异步 .addQuery("id", 1) // 设置 Query 参数 .executeAsFuture(); // 发送请求并返回 ForestFuture 对象 // 在这里并不阻塞线程,可以做些其它事情 doSomething(); // Forest.await 方法会阻塞线程并同时等待多个请求 // 只有当所有请求都完成时,才会继续往下执行 Forest.await(f1, f2).forEach(res -> { // 遍历每个 ForestResponse 对象 String result = res.get(String.class); // 从 ForestResponse 中取出数据 });
批量发送和等待多个异步请求
// new 一个 ForestFuture 对象列表 List<ForestFuture> futures = new LinkedList<>(); for (int i = 0; i < 100; i++) { // 循环100次 futures.add(Forest.get("/data") // 创建请求,并添加到 futures 列表中 .async() // 设置为异步 .addQuery("id", i) // 设置 Query 参数 .executeAsFuture()); // 发送请求,返回 ForestFuture 对象 } Forest.await(futures).forEach(res -> { // 等待这100个请求,然后进行遍历 String result = res.get(String.class); // 从 ForestResponse 中取出数据 });
Kotlin 协程
从本次更新开始 Forest 支持 Kotlin 语言的协程特性,可以在发送异步请求的时候使用 Kotlin 协程代替 JVM 的线程池
Forest 默认情况下,请求的异步模式为platform,即 JVM 平台自带的线程池
如果要启用 Kotlin 线程,需要将异步模式设置为kotlin_coroutine
forest: async-mode: kotlin_coroutine
官网和仓库地址
官网地址:
http://forest.dtflyx.com
Gitee 仓库地址:
https://gitee.com/dromara/forest
Github 仓库地址:
https://github.com/dromara/forest
本次更新内容
- feat: 异步API增强, 支持 Async/Await 风格 (#I60IAL:异步API增强)
- feat: 响应API增强, 后验数据转换 (#I60IDO:响应API增强 )
- feat: kotlin协程
- feat: 请求可中断取消执行 (#I60I90:请求可中断取消执行)
- fix: ForestHeaderMap.addCookie时可能会存在无法进入header的问题 (100)
- fix: 发送 multipart/form-data 请求时,@Body参数为空会报错 (#I5Y7WJ:发送 multipart/form-data 请求时,@Body 参数为空会报错 )
- fix: 未设置 charset 时,调用 ForestRequest.getQueryString() 报错 (#I5RGX4:未设置 charset 时,调用 ForestRequest.getQueryString() 报错 )
- fix: ForestRequest.getBasePath() 无法获取 AddressSource 中定义的 basePath (#I5RGOY:ForestRequest.getBasePath() 无法获取 AddressSource 中定义的 basePath )
- fix: x-www-form-urlencoded 格式请求 Body 在 URLEncode 时忽略 #
- fix: 在重试的时候没有关闭上一次的请求响应
还没有评论,来说两句吧...