Forest Forest
首页
  • 当前版本

    • v1.7.x
  • 历史版本

    • v1.6.x
    • v1.5.36
    • v1.5.35
    • v1.5.33
    • v1.5.30 ~ v1.5.32
    • v1.5.0 ~ v1.5.28
  • 插件

    • ForestX
  • 问答

    • 常见问题
    • 更新记录
案例
  • 加入群聊
  • 赞助我们
  • 参与贡献
  • 贡献者们
  • 项目介绍
  • 开发团队
  • 关于作者
  • MaxKey - 业界领先的身份管理和认证产品 (opens new window)
  • Snowy - 国内首个国密前后端分离快速开发平台 (opens new window)
  • Eoapi - 一个开源、可拓展的 API 工具平台 (opens new window)
  • Fast Request - IDEA版Postman,为简化API调试而生 (opens new window)
  • Bean Searcher - 专注高级查询的只读 ORM (opens new window)
  • zyplayer-doc - 可私有化部署的文档与知识库管理平台 (opens new window)
  • frSimple - 中后台脚手架/小程序商城 (opens new window)
  • Gitee (opens new window)
  • Github (opens new window)
  • GitCode (opens new window)
首页
  • 当前版本

    • v1.7.x
  • 历史版本

    • v1.6.x
    • v1.5.36
    • v1.5.35
    • v1.5.33
    • v1.5.30 ~ v1.5.32
    • v1.5.0 ~ v1.5.28
  • 插件

    • ForestX
  • 问答

    • 常见问题
    • 更新记录
案例
  • 加入群聊
  • 赞助我们
  • 参与贡献
  • 贡献者们
  • 项目介绍
  • 开发团队
  • 关于作者
  • MaxKey - 业界领先的身份管理和认证产品 (opens new window)
  • Snowy - 国内首个国密前后端分离快速开发平台 (opens new window)
  • Eoapi - 一个开源、可拓展的 API 工具平台 (opens new window)
  • Fast Request - IDEA版Postman,为简化API调试而生 (opens new window)
  • Bean Searcher - 专注高级查询的只读 ORM (opens new window)
  • zyplayer-doc - 可私有化部署的文档与知识库管理平台 (opens new window)
  • frSimple - 中后台脚手架/小程序商城 (opens new window)
  • Gitee (opens new window)
  • Github (opens new window)
  • GitCode (opens new window)
  • 入门

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

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

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

    • 请求API

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

      • 🌠 响应对象
        • 响应对象
        • 获取响应对象
          • 声明式
          • 编程式
        • 未关闭的响应对象
          • 声明式
          • 编程式
          • 关闭方式
          • 调用 close()
          • 使用 try-with-resources
          • 开启流后自动关闭
          • 读取数据后自动关闭
      • ✒️ 读取数据
      • 🦋 响应状态码
      • 🏥 响应错误处理
      • 🎧 响应头
      • 🥞 Cookie
  • SSE

    • 🐿 声明式 SSE 接口
    • 🐠 编程式 SSE 接口
    • 🐶 SSE 控制器
    • 🐬 SSE 拦截器
    • 🦄 SSE 事件处理方法
  • 模板表达式

    • 🍬 Hello World
    • 🍹 配置属性引用
    • 🍖 变量引用
    • 🥃 动态变量绑定
    • 🥗 参数序号引用
    • 🍍 引用对象属性
    • 🥝 调用对象方法
    • ⛳️ 空安全
    • 🪆 嵌套字符串模板
  • 高级特性

    • 🥪 拦截器
    • 🍏 自定义注解
    • 🍇 组合注解
    • 🥑 自定义转换器
  • v1.7.x文档
  • 编程式接口
  • 响应API
公子骏
2022-07-14
目录

🌠 响应对象

# 响应对象

响应对象是 Forest 中最核心组件之一,其类名为ForestResponse

其主要承担的作用是,将服务端返回的响应信息(包括响应头、响应体、请求异常信息)封装在该对象中

并提供直观的API对返回的数据进行读取

# 获取响应对象

如同《请求对象》一样,在 Forest 中有两种获取 ForestResponse 对象的方法:声明式接口方法返回响应对象和编程式接口创建响应对象。

# 声明式

public interface MyClient {
    /**
     * Get类型请求,url路径为 /test
     * <p>ForestResponse是带泛型参数的类型
     * <p>泛型参数代表返回的响应数据所期望转化成的类型
     * 
     * @return Forest响应对象
     */
    @Get("/test")
    ForestResponse<String> getForestResponse();
}
1
2
3
4
5
6
7
8
9
10
11

调用 getForestResponse() 方法后即可马上发送请求,并且获取该请求所返回的 Forest 响应对象

@Resource
MyClient myClient;

... ...
// 发送请求,并获取从服务端返回的响应数据对象
ForestResponse<String> response = myClient.getForestResponse();
// 获取响应结果数据
String result = response.getResult();
1
2
3
4
5
6
7
8

# 编程式

ForestResponse response = Forest.get("/test")
        .execute(ForestResponse.class);
// 获取响应结果数据
String result = response.getResult();
1
2
3
4

# 未关闭的响应对象

上面这些例子所用的 ForestResponse 是普通的 Forest 响应对象,该类型对象能够自动关闭响应连接,无需调用者操心,非常方便,但坏处就是会消耗额外的性能和内存。

在某些对性能和内存资源较为苛刻的场景,如下载文件、或读取体积较大的数据,就要考虑使用手动模式的响应对象 (UnclosedResponse)。

UnclosedResponse 对象的获取方式也和 ForestResponse 对象一样,可分为声名式和编程式

# 声明式

public interface MyClient {
    /**
     * Get类型请求,url路径为 /test
     * <p>UnclosedResponse是带泛型参数的手动响应类型
     * <p>泛型参数代表返回的响应数据所期望转化成的类型
     *
     * @return Forest响应对象
     */
    @Get("/test")
    UnclosedResponse<String> getUnclosedResponse();
}
1
2
3
4
5
6
7
8
9
10
11

调用 getForestResponse() 方法后即可马上发送请求,并且获取该请求所返回的 Forest 响应对象


@Resource
MyClient myClient;

......
// 发送请求,并获取从服务端返回的未关闭响应数据对象
UnclosedResponse<String> response = myClient.getUnclosedResponse();
// 关闭连接
response.close();
1
2
3
4
5
6
7
8
9

# 编程式

UnclosedResponse response = Forest.get("/test")
        .executeAsUnclosedResponse();
// 关闭连接
response.close();
1
2
3
4

或者

UnclosedResponse response = Forest.get("/test")
        .execute(UnclosedResponse.class);
// 关闭连接
response.close();
1
2
3
4

# 关闭方式

# 调用 close()

最简单直接的方式是调用 UnclosedResponse 对象的close()方法。

// 关闭连接
response.close();
1
2

但非常不推荐这样做。

# 使用 try-with-resources

除了调用close(),更好更安全的办法是使用try-with-resources语法自动关闭响应

// 使用 try-with-resources 托管 UnclosedResponse 对象
try (UnclosedResponse response = Forest.get("/").executeAsUnclosedResponse()) {
  //... 
}
// try 代码块结束后会自动关闭 response
1
2
3
4
5

# 开启流后自动关闭

UnclosedResponse 虽然是未关闭的响应,但有些时候也不需要我们手动关闭。

使用openStream()读取完流之后,会自动关闭连接。

Forest.get("/")
  .executeAsUnclosedResponse()
  .openStream((in, res) -> {
      // in 为 InputStream 对象
      // res 为 UnclosedResponse 响应对象
  });
  // openStream 完成后会自动关闭连接
1
2
3
4
5
6
7

# 读取数据后自动关闭

使用readAsString()、getResult()、get(Class)等方法读取完数据后,也会自动关闭连接

// 使用 readAsString() 将响应数据作为字符串读取完后,就会自动关闭
Forest.get("/")
  .executeAsUnclosedResponse()
  .readAsString();


// 调用完 getResult() 读取发序列化后结果,就会自动关闭连接
Forest.get("/")
  .executeAsUnclosedResponse()
  .getResult();


// 调用 get(Class) 按任意类型进行读取后,也会自动关闭连接
Forest.get("/")
  .executeAsUnclosedResponse()
  .get(MyData.class);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
帮助我们改善此文档 (opens new window)
上次更新: 2025/06/24, 01:16:57
🛰️ 请求代理
✒️ 读取数据

← 🛰️ 请求代理 ✒️ 读取数据→

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