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解压
    • 🎂 日志管理
    • ⚽ 回调函数
    • 🍟 异步请求
    • 🛡️ HTTPS
    • 🍪 使用Cookie
    • 🛸 使用代理
    • 🍉 上传下载
    • 🚑 异常处理
  • 编程式接口

    • 请求API

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

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

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

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

    ✒️ 读取数据

    Forest响应对象提供了多种数据读取的方式,以读取不同类型的数据

    # 自定义对象类型

    Forest响应对象可以直接读取经过反序列化后的自定义类型的对象

    该对象的类型必须和 ForestResponse<泛型参数> 中泛型参数指向的类型一致

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

    然后通过getResult方法获取转换后的对象

    getResult() 获取反序列化成对象类型的请求响应内容

    // 发送请求,并获取从服务端返回的响应数据对象
    ForestResponse<getUser> response = myClient.getUser();
    // 获取转换后的响应结果对象
    MyUser user = response.getResult();
    
    1
    2
    3
    4

    # 字符串类型

    readAsString() 以字符串方式读取请求响应内容

    // 以字符串方式读取请求响应内容
    String content = response.readAsString();
    
    1
    2

    # 字节数组类型

    getByteArray() 以字节数组的形式获取请求响应内容

    // 以字节数组的形式获取请求响应内容
    byte[] bytes = response.getByteArray();
    
    1
    2

    # 流类型

    getInputStream() throws Exception 以输入流的形式获取请求响应内容

    友情提示

    1. 以流的方式读取数据的时候,一定别忘了在读取完毕后关闭流
    2. 流只能读取一次,关闭流后不能从response.getInputStream()以及其它数据读取方法中再次读取
    // 以 try-with-resource 方式读取流后,会自动关闭流
    try (InputStream in = response.getInputStream()) {
        // 从流中读取字符串数据
        String content = IOUilts.toString(in, StandardCharsets.UTF_8);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    
    1
    2
    3
    4
    5
    6
    7

    调用response.close()方法亦可关闭响应的流

    try {
        // 获取响应流
        InputStream in = response.getInputStream()
        // 从流中读取字符串数据
        String content = IOUilts.toString(in, StandardCharsets.UTF_8);
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        // 关闭响应流
        // 关闭后不可再通过响应对象的数据读取方法获取数据
        response.close();
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    # 后验类型

    用以上的方式获取的数据,都必须和ForestResponse<T>中的泛型参数T保持一致,或者和接口方法的返回类型一致,不然就会出现类型转换的异常

    这种方式也叫先验类型转换,也就是说它必须在发送请求之前,就已经知道返回的数据类型是什么了,并且难以改变

    而从1.5.27版本开始,Forest 提供了get方法,可以在接受到请求的响应数据后,再临时决定按什么类型来取数据,这就叫后验类型转换

    get(Class<T> clazz) 将响应数据转换成目标类型,并按该类型返回

    • 版本: 1.5.27+
    • 参数clazz: Class类型 - 目标类型
    // 转换成字符串类型并返回
    String strResult = response.get(String.class);
    // 转换成Map类型(不含泛型)并返回
    List list = response.get(List.class);
    // 转换成Map类型(不含泛型)并返回
    Map map = response.get(Map.class);
    // 转换成自定义类型对象并返回
    MyUser userResult = response.get(MyUser.class);
    
    1
    2
    3
    4
    5
    6
    7
    8

    获取带泛型的类型数据

    get(TypeReference<T> typeReference) 将响应数据转换成目标类型,并按该类型返回

    • 版本: 1.5.27+
    • 参数typeReference: TypeReference类型 - 目标类型
    // 转换并获取 List<String> 类型列表数据
    List<String> list = repsonse.get(new TypeReference<List<String>>() {});
    // 转换并获取 Map<String, Object> 类型数据
    Map<String, Object> map = repsonse.get(new TypeReference<Map<String, Object>>() {});
    // 转换并获取 Result<MyUser> 类型数据
    Result<MyUser> result = response.get(new TypeReference<Result<MyUser>>() {});
    
    1
    2
    3
    4
    5
    6

    注意

    get(Class<T>)方法和get(TypeReference<T>)每次调用都会进行一次序列化转换

    在一些性能敏感的场景中应谨慎使用,避免重复的数据转换

    帮助我们改善此文档 (opens new window)
    上次更新: 2023/03/13, 15:28:40
    🌠 响应对象
    🦋 响应状态码

    ← 🌠 响应对象 🦋 响应状态码→

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