HarmonyOS 鸿蒙Next中发送 POST 请求如何得到二进制数据

HarmonyOS 鸿蒙Next中发送 POST 请求如何得到二进制数据 【问题描述】:我在 6.0 上不管使用 @kit.NetworkKit 的 http 模块、使用 @kit.RemoteCommunicationKit 还是使用 @ohos/axios 来发送 POST 请求,如果发送的数据是 Uint8Array 类型,抓包发现请求体的内容实际是一个 JSON 字符串,不是想发送的二进制内容。这个是什么原因呢?预期抓包应该得到这样的二进制数据,代码应该怎么写?

4 回复

在使用@ohos/axios中,可以使用transformRequest()方法来修改请求头

{
  url: '/user',
  method: 'get',
  baseURL: 'https://www.xxx.com/info',
  // `transformRequest` 允许在向服务器发送前,修改请求数据
  // 它只能用于 'PUT', 'POST' 和 'PATCH' 这几个请求方法
  // 数组中最后一个函数必须返回一个字符串, 一个Buffer实例,ArrayBuffer,FormData,或 Stream
  // 修改请求头。
  transformRequest: [(data: ESObject, headers: AxiosRequestHeaders) => {
     // 对发送的 data 进行任意转换处理
     return data;
   }],
}

三方库地址:[@ohos/axios(V2.2.6)](https://ohpm.openharmony.cn/#/cn/detail/@ohos%2Faxios)

更多关于HarmonyOS 鸿蒙Next中发送 POST 请求如何得到二进制数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


源码内默认转json了。

cke_690.png

如果需要二进制内容,那可以传对应的数据类型进去

cke_3383.png

还有一种方法:自定义transformRequest这个方法,这个方法可以处理发送请求的参数,处理完return结果就可以了。

在HarmonyOS Next中,通过@ohos.net.http模块发送POST请求获取二进制数据。使用http.createHttp()创建请求对象,在request方法中设置responseType: http.ResponseType.ARRAY_BUFFER。成功回调的响应对象中,result属性即为ArrayBuffer类型的二进制数据。

在HarmonyOS Next中,发送POST请求时若希望请求体为原始二进制数据(而非自动序列化为JSON),关键在于正确设置请求头Content-Type,并确保数据以ArrayBufferUint8Array形式发送。以下以@kit.NetworkKithttp模块为例说明:

  1. 设置请求头:将Content-Type明确指定为application/octet-stream,这表示请求体是纯二进制流。
  2. 发送数据:直接传递Uint8ArrayArrayBuffer作为请求体,无需额外处理。

示例代码:

import { http } from '@kit.NetworkKit';

async function sendBinaryData(url: string, binaryData: Uint8Array) {
  let request: http.HttpRequest = {
    method: http.RequestMethod.POST,
    header: { 'Content-Type': 'application/octet-stream' },
    extraData: binaryData.buffer, // 使用ArrayBuffer
    connectTimeout: 60000,
    readTimeout: 60000,
  };
  try {
    let response = await http.request(url, request);
    console.log('Response:', response.result);
  } catch (error) {
    console.error('Request failed:', error);
  }
}

注意事项

  • 使用@ohos/axios时,同样需设置headers: { 'Content-Type': 'application/octet-stream' },并将数据作为ArrayBuffer传递。
  • 避免依赖库的默认序列化行为;设置Content-Typeapplication/octet-stream可强制以二进制形式发送。
  • 抓包工具显示的格式取决于请求头设置,正确设置后应能看到原始二进制数据。

此方法确保二进制数据按预期发送,不会转换为JSON字符串。

回到顶部