4.34版本 uni-app post请求的传 ArrayBuffer 作为 data 是传参有误

4.34版本 uni-app post请求的传 ArrayBuffer 作为 data 是传参有误

操作步骤:

  • 必现

预期结果:

  • 请求正常

实际结果:

  • 请求失败

bug描述:

post请求的传 ArrayBuffer 作为 data 是,传参有误,图片为浏览器正常,文本为鸿蒙手机请求参数

'content-type': 'application/json;charset=UTF-8',

附件

表格

项目
产品分类 uniapp/App
PC开发环境 Windows
PC开发环境版本 win10
HBuilderX类型 正式
HBuilderX版本 4.34
手机系统 HarmonyOS NEXT
手机系统版本 HarmonyOS NEXT Developer Beta2
手机厂商 华为
手机机型 mate60
页面类型 vue
vue版本 vue3
打包方式 云端
项目创建方式 HBuilderX

更多关于4.34版本 uni-app post请求的传 ArrayBuffer 作为 data 是传参有误的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于4.34版本 uni-app post请求的传 ArrayBuffer 作为 data 是传参有误的实战教程也可以访问 https://www.itying.com/category-93-b0.html


uni-app 中,使用 uni.request 进行 POST 请求时,如果你需要传递 ArrayBuffer 作为请求体,可能会遇到一些问题。以下是一些可能的原因和解决方案:

1. 检查 header 配置

确保你正确设置了请求头 Content-Type。对于 ArrayBuffer 数据,通常需要使用 application/octet-streamarraybuffer 作为 Content-Type

uni.request({
  url: 'https://example.com/api',
  method: 'POST',
  header: {
    'Content-Type': 'application/octet-stream'
  },
  data: arrayBufferData, // 你的 ArrayBuffer 数据
  success: (res) => {
    console.log(res.data);
  },
  fail: (err) => {
    console.error(err);
  }
});

2. 确保 dataArrayBuffer 类型

确保你传递给 data 的参数确实是 ArrayBuffer 类型。如果数据源是 BlobFile,你需要先将其转换为 ArrayBuffer

// 假设你有一个 Blob 对象
const blob = new Blob(['Hello, world!'], { type: 'text/plain' });

// 将 Blob 转换为 ArrayBuffer
const reader = new FileReader();
reader.onload = function() {
  const arrayBuffer = reader.result;

  uni.request({
    url: 'https://example.com/api',
    method: 'POST',
    header: {
      'Content-Type': 'application/octet-stream'
    },
    data: arrayBuffer,
    success: (res) => {
      console.log(res.data);
    },
    fail: (err) => {
      console.error(err);
    }
  });
};
reader.readAsArrayBuffer(blob);

3. 检查服务器端处理

确保服务器端能够正确处理 ArrayBuffer 数据。服务器端可能需要根据 Content-Type 来解析请求体。

4. 使用 ArrayBuffer 的替代方案

如果你仍然遇到问题,可以考虑将 ArrayBuffer 转换为 Base64 字符串进行传输,然后在服务器端再将其转换回 ArrayBuffer

// 将 ArrayBuffer 转换为 Base64
function arrayBufferToBase64(buffer) {
  let binary = '';
  const bytes = new Uint8Array(buffer);
  const len = bytes.byteLength;
  for (let i = 0; i < len; i++) {
    binary += String.fromCharCode(bytes[i]);
  }
  return btoa(binary);
}

const base64Data = arrayBufferToBase64(arrayBufferData);

uni.request({
  url: 'https://example.com/api',
  method: 'POST',
  header: {
    'Content-Type': 'application/json'
  },
  data: {
    data: base64Data
  },
  success: (res) => {
    console.log(res.data);
  },
  fail: (err) => {
    console.error(err);
  }
});

5. 检查 uni-app 版本

确保你使用的 uni-app 版本是最新的,或者至少是支持 ArrayBuffer 的版本。如果你使用的是较旧的版本,可能会存在一些兼容性问题。

6. 调试和日志

在开发过程中,使用 console.loguni.showModal 来调试和查看请求的 dataheader 是否正确设置。

console.log('ArrayBuffer data:', arrayBufferData);
console.log('Request headers:', {
  'Content-Type': 'application/octet-stream'
});
回到顶部