HarmonyOS鸿蒙Next中使用httpRequest.request发送FormData数据后端没有接收到参数, FormData定义有问题吗?

HarmonyOS鸿蒙Next中使用httpRequest.request发送FormData数据后端没有接收到参数, FormData定义有问题吗? 使用httpRequest.request发送FormData数据后端没有接收到参数, FormData定义有问题吗?

cke_114.png

cke_1357.png

cke_445.png


更多关于HarmonyOS鸿蒙Next中使用httpRequest.request发送FormData数据后端没有接收到参数, FormData定义有问题吗?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

通过代码分析,发现代码中在request.uploadFile第一个参数为stageMode:ture;需要改成上下文context才可以;并且去掉大括号;具体修改代码如图:

cke_234.png

更多关于HarmonyOS鸿蒙Next中使用httpRequest.request发送FormData数据后端没有接收到参数, FormData定义有问题吗?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


文档参数类型为BaseContext, 而实际需要的是BaseContext的实现, 文档上没有说明清楚。

看了一下文档;他要的是一个类;你使用 {} 定义的是一个接口,

好的;明白了,问题已解决,

根据你提供的内容判断时获取上下文失败,关键问题可能不在已有截图里面,需要你提供更完整的涉及context上下文内容的地方代码

在HarmonyOS Next中,使用httpRequest.request发送FormData数据时,若后端未接收到参数,问题通常出在FormData的构建方式上。请检查是否使用了正确的API来设置FormData参数。例如,应使用append方法添加键值对,并确保请求头Content-Type设置为'multipart/form-data'。同时,确认请求方法为POST,且FormData对象已正确传递给请求的data字段。

从您提供的代码截图来看,问题很可能出在FormData的构建方式上。在HarmonyOS Next中,httpRequest.request 对请求体(extraData)的处理方式与Web标准或某些前端框架有所不同。

核心问题分析:

您代码中的关键部分是:

let formData = new FormData();
formData.append('file', fileObj);
formData.append('userId', '123');
request.extraData = formData;

在HarmonyOS的httpRequest模块中,extraData 字段不能直接接收一个 FormData 对象。它期望的是一个字符串(如JSON、URL编码字符串)或一个 ArrayBuffer

解决方案:

您需要手动将FormData的内容转换为一个符合 multipart/form-data 格式的 ArrayBuffer。这涉及到构造带有边界(boundary)的特定格式的二进制数据。

以下是修改后的关键步骤:

  1. 手动构建 multipart 请求体: 您需要创建一个字符串或ArrayBuffer,其格式符合HTTP的multipart/form-data规范。例如:

    // 1. 定义一个唯一的边界字符串
    let boundary = '----WebKitFormBoundary' + Math.random().toString(36).substring(2);
    // 2. 设置正确的请求头
    request.header['Content-Type'] = 'multipart/form-data; boundary=' + boundary;
    
    // 3. 手动构建请求体内容
    let body = '';
    // 添加文本字段
    body += `--${boundary}\r\n`;
    body += `Content-Disposition: form-data; name="userId"\r\n\r\n`;
    body += `123\r\n`;
    // 添加文件字段
    body += `--${boundary}\r\n`;
    body += `Content-Disposition: form-data; name="file"; filename="${fileObj.name}"\r\n`;
    body += `Content-Type: ${fileObj.type}\r\n\r\n`;
    // 这里需要将文件内容(fileObj.content)以二进制形式追加到body中
    // body += [文件二进制数据] + '\r\n';
    body += `--${boundary}--\r\n`;
    
    // 4. 将字符串转换为 ArrayBuffer 并赋值
    let encoder = new util.TextEncoder();
    request.extraData = encoder.encode(body).buffer;
    
  2. 处理文件二进制数据: 上面的示例中,fileObj.content 需要是文件的二进制数据(如通过fs.readSync读取得到的ArrayBuffer)。您需要确保fileObj对象包含正确的二进制内容,并将其插入到构建的body字符串的相应位置。实际操作中,构建完整的二进制ArrayBuffer可能需要使用Uint8Array进行拼接。

  3. 使用第三方库: 考虑到手动构建 multipart/form-data 格式比较复杂且容易出错,一个更高效、可靠的方法是使用社区或第三方提供的网络请求库(例如,对axios进行适配或使用专为HarmonyOS封装的库),这些库通常会封装好FormData的处理逻辑。

总结: 问题不在于FormData的定义,而在于httpRequest.request模块的extraData参数不支持FormData对象作为输入。您必须按照multipart/form-data格式标准,手动构建请求体并设置为ArrayBuffer类型。建议优先考虑使用成熟的第三方网络库来简化此过程。

回到顶部