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环境使用
    • 🏹 Springboot3环境安装
    • 📐 Springboot3环境配置
    • 🎯 Springboot3环境使用
    • 🏹 Spring环境安装
    • 📐 Spring环境配置
    • 🎯 Spring环境使用
    • 🏹 Solon环境安装
    • 📐 Solon环境配置
    • 🎯 Solon环境使用
    • 🏹 原生Java环境安装
    • 📐 原生Java环境配置
    • 🎯 原生Java环境使用
    • 🧬 编程式接口
  • 配置项

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

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

    • 请求API

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

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

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

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

🍟 异步请求

# 设置异步/同步

在Forest使用异步请求,可以通过设置@Request注解的async属性为true实现,不设置或设置为false即为同步请求

/**
 * async 属性为 true 即为异步请求,为 false 则为同步请求
 * 不设置该属性时,默认为 false
 */
@Get(
        url = "http://localhost:8080/hello/user?username=${0}",
        async = true
)
String asyncGet(String username);
1
2
3
4
5
6
7
8
9

# 使用回调函数

异步请求的方法无法直接通过返回值接受服务端响应的结果,因为在网络还在没完成连接和响应的过程中,方法已经返回了

此时需要成功/失败回调函数来响应网络请求的结果

@Get(
        url = "http://localhost:8080/hello/user?username=${0}",
        async = true,
        headers = {"Accept:text/plain"}
)
void asyncGet(String username, OnSuccess<String> onSuccess,OnError onError);
1
2
3
4
5
6

一般情况下,异步请求都通过OnSuccess<T> 回调函数来接受响应返回的数据,而不是通过接口方法的返回值,所以这里的返回值类型一般会定义为void。

文档导航

关于回调函数的使用请参见 《回调函数》

// 异步执行
myClient.asyncGet("foo",(result,req,res)->{
        // 请求成功,处理响应结果
        System.out.println(result);
        },(ex,req,res)->{
        // 请求失败,处理失败信息
        System.out.println(ex.getMessage());
        });
1
2
3
4
5
6
7
8

# 使用 Future 接受异步数据

此外,若有些小伙伴不习惯这种函数式的编程方式,也可以用Future<T>类型定义方法返回值的方式来接受响应数据。

@Request(
        url = "http://localhost:8080/hello/user?username=foo",
        async = true,
        headers = {"Accept:text/plain"}
)
Future<String> asyncFuture();
1
2
3
4
5
6

这里Future<T>类就是JDK自带的java.util.concurrent.Future类, 其泛型参数T代表您想接受的响应数据的类型。

关于如何使用Future类,这里不再赘述。

// 异步执行
Future<String> future=myClient.asyncFuture();

// 做一些其它事情

// 等待数据
        String result=future.get();
1
2
3
4
5
6
7

# 开启 Kotlin 协程

自1.5.27版本开始 Forest 支持 Kotlin 语言的协程特性,可以在发送异步请求的时候使用 Kotlin 协程代替 JVM 的线程池

在使用 Kotlin 协程之前,需要先确保可以使用 Kotlin 语言,并有以下依赖

    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib</artifactId>
        <version>1.6.20</version>
    </dependency>
    
    <dependency>
        <groupId>org.jetbrains.kotlinx</groupId>
        <artifactId>kotlinx-coroutines-core</artifactId>
        <version>1.6.2</version>
    </dependency>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    compile group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib', version: '1.6.20'
    compile group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core', version: '1.6.2'
    
    1
    2
    // Make sure to add code blocks to your code group

    Forest 默认情况下,请求的异步模式为platform,即 JVM 平台自带的线程池

    如果要启用 Kotlin 线程,需要将异步模式设置为kotlin_coroutine

      forest:
        async-mode: kotlin_coroutine
      
      1
      2
      forest.async-mode=kotlin_coroutine
      
      1
      Forest.config().setAsyncMode(ForestAsyncMode.KOTLIN_COROUTINE);
      
      1
      // Make sure to add code blocks to your code group
      帮助我们改善此文档 (opens new window)
      上次更新: 2023/03/13, 15:28:40
      ⚽ 回调函数
      🛡️ HTTPS

      ← ⚽ 回调函数 🛡️ HTTPS→

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