HarmonyOS 鸿蒙Next中一个流式请求方法

HarmonyOS 鸿蒙Next中一个流式请求方法

// 异步方法:发起HTTP请求获取数据
async getHttpData(queryData: string) {
  // 在控制台打印查询字符串,用于调试
  console.log('http getHttpData query:' + queryData);
  // 创建QueryDataBean对象,作为请求体
  let query: QueryDataBean = {
    "inputs": {
      "query": queryData  // 将用户查询字符串放入请求体
    }
  }
  // 创建HTTP请求对象
  let httpRequest = http.createHttp();
  // 监听'dataReceive'事件:当收到服务器数据时触发(流式响应)
  httpRequest.on('dataReceive', (data: ArrayBuffer) => {
    // try-catch块:捕获并处理可能出现的异常
    try {
      // 创建一个TextDecoder实例,用于将二进制数据解码为字符串
      let decoder = util.TextDecoder.create('utf-8');
      // 将ArrayBuffer转换为Uint8Array,然后解码为字符串
      let stringData = decoder.decodeToString(new Uint8Array(data));
      // 打印接收到的原始字符串数据
      console.log('http 查询字符串结果:'+stringData);
      // 检查接收到的数据是否包含"content"字段
      if (stringData.includes("content")) {
        // 清洗字符串:移除不需要的字符和前缀
        let jsonStr=stringData.replace('data:','')  // 移除SSE格式的"data:"前缀
          .replaceAll('#','')  // 移除所有#字符
          .replaceAll('*','')  // 移除所有*字符
          .replaceAll('\uD83C\uDF0D','');  // 移除地球emoji字符
        // 打印清洗后的字符串
        console.log('http 转换后的字符串:'+jsonStr);
        // 将JSON字符串解析为ResultsBean对象
        let tempRes:ResultsBean = JSON.parse(jsonStr)
        // 将解析出的content内容追加到现有的result中
        this.result = this.result + tempRes.content
      }
    } catch (e) {
      // 异常处理:当前为空,任何异常都会被静默忽略
      // 在实际开发中,这里应该添加错误处理逻辑
    }
  });
  // 配置HTTP请求选项
  let streamInfo: http.HttpRequestOptions = {
    method: http.RequestMethod.POST,  // 请求方法为POST
    header: {  // 请求头
      'Content-Type': 'application/json',  // 内容类型为JSON
      "X-Auth-Token": token  // 认证令牌
    },
    extraData: JSON.stringify(query),  // 请求体数据(转换为JSON字符串)
    remoteValidation: 'skip',  // 跳过远程验证(用于开发环境)
  }
  // 发起流式HTTP请求
  httpRequest.requestInStream(url, streamInfo)
    .then((data: number) => {
      // 请求成功时的回调
      console.log('http requestInStream ok!');
    }).catch((error: BusinessError) => {
    // 请求失败时的回调
    // 当前为空,错误被静默忽略
    // 在实际开发中,这里应该添加错误处理逻辑
  })
}

更多关于HarmonyOS 鸿蒙Next中一个流式请求方法的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

棒的

更多关于HarmonyOS 鸿蒙Next中一个流式请求方法的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


学习了,先收藏。

学习了

在HarmonyOS Next中,流式请求方法通常指使用@ohos.net.http模块的createHttp()创建HttpClient实例,调用其request()方法并设置stream参数为true。这允许应用以流式方式接收响应数据,通过监听dataReceive事件逐步处理数据块,适用于处理大文件或实时数据流。

这段代码演示了在HarmonyOS Next中使用 @ohos.net.http 模块进行流式HTTP请求的基本方法,核心是 requestInStreamon('dataReceive') 事件监听。

关键点分析:

  1. 流式请求初始化:使用 http.createHttp() 创建请求对象后,通过 httpRequest.on('dataReceive', callback) 监听数据块到达事件。这是处理服务器端推送(如SSE)或大文件下载的关键。

  2. 数据解码与处理:在 dataReceive 回调中,数据以 ArrayBuffer 形式到达。代码使用 util.TextDecoder 将其解码为UTF-8字符串。这是标准做法。

  3. 请求配置HttpRequestOptions 中的 extraData 用于设置POST请求体,remoteValidation: 'skip' 通常在开发阶段用于跳过证书验证(生产环境应谨慎使用)。

需要注意的几点:

  • 数据清洗逻辑:代码中对接收的字符串进行了替换操作(如移除 data:#* 等)。这高度依赖于特定服务端的响应格式(似乎是SSE格式),不具备通用性。在实际应用中,应首先明确与服务器约定的数据协议(如纯JSON、SSE、自定义分隔符等),再进行解析。
  • 错误处理:当前的 catch 块和 try-catch 内的错误处理均为空,这在生产代码中是隐患。至少应记录错误日志或通知上层调用者。
  • 资源释放:示例中没有展示 httpRequest.off('dataReceive') 来取消事件监听以及 httpRequest.destroy() 来释放请求对象。在请求完成或组件销毁时,应执行这些清理操作以避免内存泄漏。
  • 类型安全QueryDataBeanResultsBean 的类型定义在代码中未给出。确保这些接口与服务器端的请求/响应数据结构严格匹配,这对于维护代码很重要。

总结: 这段代码提供了流式请求的骨架。要用于生产,需要完善错误处理、资源管理,并根据实际网络协议调整数据解析逻辑。

回到顶部