uni-app中uni.request在android下使用post协议提交长度为0的ArrayBuffer无法发起请求

uni-app中uni.request在android下使用post协议提交长度为0的ArrayBuffer无法发起请求

开发环境 版本号 项目创建方式
PC Mac
手机 Android
手机厂商 华为
手机机型 v30
页面类型 vue
vue vue2
打包方式 离线
CLI 3.3.13.20220314 CLI

示例代码:

let header: any = {  
    'Content-Type': 'application/octet-stream',  
    accept: 'application/octet-stream',  
};  

uni.request({  
    url: url,  
    method: 'POST',  
    data: new ArrayBuffer(),  
    header: header,  
    responseType: 'arraybuffer',  
    fail: (res: any) => {  
        console.error("uni.request", res)  
    },  
    success: (res: any) => {  
        console.log("uni.request", res)  
    }  
})
`
3 回复

iOS还没有测试,不知道是否也存在这个问题


希望官方重视一下,现在都还有此问题

在 uni-app 中使用 uni.request 发起 POST 请求时,如果提交的 ArrayBuffer 长度为 0,可能会在某些 Android 设备上无法正常发起请求。这通常是由于底层网络库或设备本身的限制导致的。

解决方案

  1. 检查 ArrayBuffer 长度: 在发送请求之前,先检查 ArrayBuffer 的长度。如果长度为 0,可以采取其他处理方式,比如不发送请求,或者发送一个空的 JSON 对象。

    let arrayBuffer = new ArrayBuffer(0);
    
    if (arrayBuffer.byteLength === 0) {
        console.log("ArrayBuffer is empty, skipping request");
        // 可以选择不发送请求,或者发送一个空的 JSON 对象
        uni.request({
            url: 'https://example.com/api',
            method: 'POST',
            data: {},
            success: (res) => {
                console.log('Request successful:', res);
            },
            fail: (err) => {
                console.error('Request failed:', err);
            }
        });
    } else {
        uni.request({
            url: 'https://example.com/api',
            method: 'POST',
            data: arrayBuffer,
            success: (res) => {
                console.log('Request successful:', res);
            },
            fail: (err) => {
                console.error('Request failed:', err);
            }
        });
    }
  2. 使用其他数据类型: 如果可能,考虑使用其他数据类型(如 JSONFormData)来代替 ArrayBuffer,特别是在数据为空的情况下。

    let data = {}; // 使用空的 JSON 对象
    
    uni.request({
        url: 'https://example.com/api',
        method: 'POST',
        data: data,
        success: (res) => {
            console.log('Request successful:', res);
        },
        fail: (err) => {
            console.error('Request failed:', err);
        }
    });
  3. 使用自定义请求头: 在某些情况下,设置自定义请求头可能会解决问题。你可以尝试设置 Content-Typeapplication/octet-stream 或其他合适的类型。

    uni.request({
        url: 'https://example.com/api',
        method: 'POST',
        data: arrayBuffer,
        header: {
            'Content-Type': 'application/octet-stream'
        },
        success: (res) => {
            console.log('Request successful:', res);
        },
        fail: (err) => {
            console.error('Request failed:', err);
        }
    });
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!