Forest Forest
💒 首页
  • v1.5.30
  • v1.5.28
  • 🎄 ForestX
🌰 案例
💖 支持
🛫 更新记录
🧢 开发团队
⚒️ 参与贡献
  • MaxKey - 业界领先的身份管理和认证产品 (opens new window)
  • Snowy - 国内首个国密前后端分离快速开发平台 (opens new window)
  • Eoapi - 一个开源、可拓展的 API 工具平台 (opens new window)
  • Gitee (opens new window)
  • Github (opens new window)
💒 首页
  • v1.5.30
  • v1.5.28
  • 🎄 ForestX
🌰 案例
💖 支持
🛫 更新记录
🧢 开发团队
⚒️ 参与贡献
  • MaxKey - 业界领先的身份管理和认证产品 (opens new window)
  • Snowy - 国内首个国密前后端分离快速开发平台 (opens new window)
  • Eoapi - 一个开源、可拓展的 API 工具平台 (opens new window)
  • Gitee (opens new window)
  • Github (opens new window)
  • 序言

    • 🎁 新手介绍
    • 📖 文档
    • 🌰 使用案例
    • 🕵️‍ 关于作者
    • 👨‍🎓 贡献者列表
  • 入门

    • 🎬 安装配置说明
    • 🏹 Springboot环境安装
    • 📐 Springboot环境配置
    • 🎯 Springboot环境使用
    • 🏹 Spring环境安装
    • 📐 Spring环境配置
    • 🎯 Spring环境使用
    • 🏹 原生Java环境安装
    • 📐 原生Java环境配置
    • 🎯 原生Java环境使用
    • 🧬 编程式接口
  • 配置项

    • 👜 Springboot环境配置项
    • 👝 Spring环境配置项
    • 🎒 原生Java环境配置项
    • 📚 配置优先级/作用域
  • 声明式接口

    • 🧱 构建接口
    • 🍀 请求方法
    • 🚚 请求地址
    • 🎈 URL 参数
    • 🍭 请求头
    • 👔 请求体
    • 🍮 后端框架
    • 🧁 接口注解
    • 📬 接收数据
    • 🍛 数据转换
    • 🍓 成功/失败条件
    • 🍌 重试机制
    • 🥂 重定向
    • 🍔 Gzip解压
    • 🎂 日志管理
    • ⚽ 回调函数
      • 成功/失败回调函数
      • 下载进度回调函数
      • 重定向回调函数
    • 🍟 异步请求
    • 🛡️ HTTPS
    • 🍪 使用Cookie
    • 🛸 使用代理
    • 🍉 上传下载
    • 🚑 异常处理
  • 编程式接口

    • 请求API

      • 🚀 请求对象
      • 🚢 请求属性
      • ✨ 执行请求
      • 🎊 后端框架
      • 🎪 请求类型
      • 🔮 请求地址
      • 🧀 URL 参数
      • 🚅 请求头
      • 🚋 请求体
      • ⚓ 回调函数
      • 🚁 异步请求
      • 🥯 Cookie
      • 🍜 成功/失败条件
      • 🌶️ 重试机制
      • ⛵ 重定向
      • 🛰️ 请求代理
    • 响应API

      • 🌠 响应对象
      • ✒️ 读取数据
      • 🦋 响应状态码
      • 🏥 响应错误处理
      • 🎧 响应头
      • 🥞 Cookie
  • 模板表达式

    • 🍬 Hello World
    • 🍹 配置属性引用
    • 🍖 变量引用
    • 🥃 动态变量绑定
    • 🥗 参数序号引用
    • 🍍 引用对象属性
    • 🥝 调用对象方法
  • 高级特性

    • 🥪 拦截器
    • 🍏 自定义注解
    • 🍇 组合注解
    • 🥑 自定义转换器
  • v1.5.28文档
  • 声明式接口
公子骏
2022-07-01
目录

⚽ 回调函数

在Forest中的回调函数使用单方法的接口定义,这样可以使您在 Java 8 或 Kotlin 语言中方便使用 Lambda 表达式。

# 成功/失败回调函数

在接口方法加入OnSuccess<T>类型或OnError类型的参数

@Request(
        url = "http://localhost:8080/hello/user",
        headers = {"Accept:text/plain"},
        data = "username=${username}"
)
String send(@Var("username") String username, OnSuccess<String> onSuccess, OnError onError);
1
2
3
4
5
6

如这两个回调函数的类名所示的含义一样,OnSuccess<T>在请求成功调用响应时会被调用,而OnError在失败或出现错误的时候被调用。

其中OnSuccess<T>的泛型参数T定义为请求响应返回结果的数据类型。

myClient.send("foo", (String resText, ForestRequest request, ForestResponse response) -> {
        // 成功响应回调
        System.out.println(resText);    
    },
    (ForestRuntimeException ex, ForestRequest request, ForestResponse response) -> {
        // 异常回调
        System.out.println(ex.getMessage());
    });
1
2
3
4
5
6
7
8

提示

  • 在异步请求中只能通过OnSuccess<T>回调函数接或Future返回值接受数据。
  • 而在同步请求中,OnSuccess<T>回调函数和任何类型的返回值都能接受到请求响应的数据。
  • OnError回调函数可以用于异常处理,一般在同步请求中使用try-catch也能达到同样的效果。

# 下载进度回调函数

在接口方法加入OnProgress类型的参数

/**
 * OnProgress 回调函数可以用于下载文件类请求方法的参数中
 */
@Get("/xxx-img.jpg")
byte[] downloadFile(OnProgress onProgress);
1
2
3
4
5

如果请求成功访问到URL指定的文件资源,且开始进行下载,则会反复调用参数中传入的 OnProgress 回调函数

// 每传输一定的字节数,便会调用一次 OnProgress 回调函数
byte[] bytes = downloadClient.downloadFile(progress -> {
    System.out.println("------------------------------------------");
    System.out.println("total bytes: " + progress.getTotalBytes()); // 文件总字节数
    System.out.println("current bytes: " + progress.getCurrentBytes()); // 当前已传输字节数
    System.out.println("progress: " + Math.round(progress.getRate() * 100) + "%"); // 传输百分百
    if (progress.isDone()) {
        // 若已传输完毕
        System.out.println("--------   Download Completed!   --------");
        atomicProgress.set(progress);
    }
});
1
2
3
4
5
6
7
8
9
10
11
12

# 重定向回调函数

当前请求响应接受到的是 302、304 等状态码时,Forest 会触发自动重定向,即会立刻发送一个新的请求

若要拦截或修改新的跳转请求可以使用 OnRedirection 回调函数

/**
 * OnRedirection 回调函数可以用自动重定向请求方法的参数中
 */
@Post("/")
String testRedirect(OnRedirection onRedirection);
1
2
3
4
5

当触发重定向时,在发送新的跳转请求前,会调用参数中传入的 OnRedirection 回调函数

String result = redirectClient.testNotAutoRedirect(((redirectReq, prevReq, prevRes) -> {
    // prevReq 为跳转前的请求对象
    // prevRes 为跳转前接受到的响应对象
    // redirectReq 为新的即将跳转的请求对象
}));
1
2
3
4
5
帮助我们改善此文档 (opens new window)
上次更新: 2023/03/07, 12:59:48
🎂 日志管理
🍟 异步请求

← 🎂 日志管理 🍟 异步请求→

Theme by Vdoing | Copyright © 2016-2023 公子骏 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式