HarmonyOS 鸿蒙Next:ArkTs 下网络请求使用 Post 表单传参时,Content-Type 设置为 multipart/form-data,按文档说明传参但参数无法传递到后台

发布于 1周前 作者 phonegap100 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:ArkTs 下网络请求使用 Post 表单传参时,Content-Type 设置为 multipart/form-data,按文档说明传参但参数无法传递到后台

//请求的配置 let requestOption = { method: http.RequestMethod.POST, header: { ‘Content-Type’: ‘multipart/form-data’ }, //POST 请求的body extraData: {“data”:{request:encyData} }, //返回数据类型 expectDataType: http.HttpDataType.STRING, usingCache:false, connectTimeout: 30_000, readTimeout: 30_000 } return new Promise<T>((resolve, reject) => { httpRequest.request(finalUrl, requestOption, (err, data) => { if (!err) { if (HttpUtils.DEBUG) { // data.result为HTTP响应内容,可根据业务需要进行解析 console.info(‘Result:’ + JSON.stringify(data.result) + “\n” + ‘code:’ + JSON.stringify(data.responseCode) + “\n” + ‘header:’ + JSON.stringify(data.header) + “\n” + ‘cookies:’ + JSON.stringify(data.cookies)); } let bean: T = JSON.parse(JSON.stringify(data.result)) resolve(bean) // 取消订阅HTTP响应头事件 httpRequest.off(‘headersReceive’); // 当该请求使用完毕时,调用destroy方法主动销毁 httpRequest.destroy(); } else { if (HttpUtils.DEBUG) { console.info(‘error:’ + JSON.stringify(err)); } reject(err) // 取消订阅HTTP响应头事件 httpRequest.off(‘headersReceive’); // 当该请求使用完毕时,调用destroy方法主动销毁。 httpRequest.destroy(); } }) })


更多关于HarmonyOS 鸿蒙Next:ArkTs 下网络请求使用 Post 表单传参时,Content-Type 设置为 multipart/form-data,按文档说明传参但参数无法传递到后台的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

11 回复

尝试了,带文件的不行,抓包会被截取,有没有别的办法?

更多关于HarmonyOS 鸿蒙Next:ArkTs 下网络请求使用 Post 表单传参时,Content-Type 设置为 multipart/form-data,按文档说明传参但参数无法传递到后台的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


怎么拼二进制数据和文本呢

问题已经解决,处理方式是手动创建 multipart/form-data 下的请求体,具体方式如下:

/**
 * 构建post 请求参数
 * @returns
 */
static buildFormData(content: string): FormData {
  let formData = new FormData()
  let splitStr = "f76d642e-a125-49b8-a90e-4cc887a758b1" // 这个要随机生成一个 uuid
  formData.contentType = "multipart/form-data; boundary=" + splitStr
  formData.body = "--" + splitStr + "\r\n" +
  "Content-Disposition: form-data; name=\"request\"" + "\r\n" +
  "Content-Length: " + content.length + "\r\n\r\n" +
  content + "\r\n" +
  "--" + splitStr + "--"
  return formData
}
//请求的配置
let requestOption = {
  method: http.RequestMethod.POST,
  header: {
    'Content-Type': formData.contentType
  },
  //POST 请求的body
  extraData: formData.body,
  //返回数据类型
  expectDataType: http.HttpDataType.STRING,
  usingCache: false,
  connectTimeout: 30_000,
  readTimeout: 30_000
}

多个参数,body怎么写?

多个参数的自己搞出来了。

static buildFormData(data?: object): FormData {
    let boundary = util.generateRandomUUID(false);
    let contentType = "multipart/form-data; boundary=" + boundary
    let body = "--" + boundary
    if (data && typeof data === 'object') {
      let entries: [string, string][] = Object.entries(data);
      entries.forEach((keyValues: [key: string,value: string], index: number) => {
        const key: string = keyValues[0]
        const value: string = keyValues[1]
        body +=  "\r\n"+"Content-Disposition: form-data; name=\"" + key + "\"" + "\r\n" +
          "Content-Length: " + value.length + "\r\n\r\n" +
          value + "\r\n"
        body += "--" + boundary
      });
      body += '--'
    }
    return { contentType, body }
}

按照这么传,我下面还有一个multiFormDataList,发现extraData传过去了,但是文件没传过去,还需要做什么处理嘛,

期待大佬回复

对不起,您的内容似乎不包含实际的HTML代码。请您提供具体的HTML内容以便我可以将其转换为Markdown格式。

大佬,我怎么没有这个类啊FormData,

自己定义的一个类,里面就body 和 contentType 两个属性,

在HarmonyOS鸿蒙Next的ArkTs框架中,当你使用Post表单传参且需要将Content-Type设置为multipart/form-data时,如果参数无法传递到后台,通常是因为表单数据的格式构建不正确或者请求头设置有误。

请确保以下几点:

  1. 表单数据构建:使用正确的multipart/form-data格式构建表单数据。这通常涉及到为每个表单字段创建一个part,包括字段名和字段值,并且每个part之间需要有正确的边界分隔符。

  2. 请求头设置:Content-Type头部不仅需要设置为multipart/form-data,还需要包含boundary参数,该参数的值应与表单数据中使用的边界分隔符相匹配。

  3. 检查后端接收:确认后端服务器能够正确解析multipart/form-data格式的请求体,包括字段名和字段值的编码等。

  4. 调试和日志:开启客户端和服务器的详细日志记录,检查请求的实际发送内容和服务器接收到的内容,以便定位问题。

如果以上步骤均正确无误,但问题依旧存在,可能是ArkTs框架或相关库的bug。此时,建议直接联系官网客服以获取更专业的帮助。

如果问题依旧没法解决请联系官网客服, 官网地址是:https://www.itying.com/category-93-b0.html

回到顶部