uni-app 真机运行请求接口报错 request:fail abort statusCode:-1 Android internal error H5和模拟器均正常

发布于 1周前 作者 htzhanglong 来自 Uni-App

uni-app 真机运行请求接口报错 request:fail abort statusCode:-1 Android internal error H5和模拟器均正常

产品分类

uniapp/App

开发环境信息

项目 信息
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 windows11
HBuilderX类型 正式
HBuilderX版本号 4.36
手机系统 Android
手机系统版本号 Android 11
手机厂商 华为
手机机型 HUAWEI Mate20 Pro, 荣耀等多个手机
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

示例代码

import $config from '@/config.js'
import $store from '@/common/store/index.js'

export default function http(param) {
    // 封装的请求拦截的配置项
    const config = {
        baseUrl: $config.gateway, // 请求的本域名,网关地址,在config中设置的网关
        method: param.method,
        // 设置为json,返回后会对数据进行一次JSON.parse()
        dataType: 'json',
        loadingMask: true, // 展示loading的时候,是否给一个透明的蒙层,防止触摸穿透
        // 配置请求头信息
        header: {
            'content-type': 'application/json;charset=UTF-8',
            'Form-type': 'app'
        },
    }

    if (param.needToken) {
        let token = uni.getStorageSync('token')
        config.header['Authorization'] = "Bearer " + token
    }

    return new Promise((resolve, reject) => {
        uni.showLoading({
            title: '加载中',
            mask: true
        })

        uni.request({
            url: config.baseUrl + param.url,
            method: config.method,
            dataType: config.dataType,
            data: param.params,
            header: config.header,
            sslVerify: false,
            success(response) {
                if (response.statusCode == 200) {
                    resolve(response)
                    if (response.data.code == 400003) {
                        uni.showToast({
                            title: '请登录,1秒后自动跳转登录',
                            icon: 'none'
                        })
                        // 清除缓存
                        uni.removeStorage({ key: 'isLogin' })
                        uni.removeStorage({ key: 'token' })
                        uni.removeStorage({ key: 'userInfo' })
                        uni.clearStorage()
                        setTimeout(() => {
                            uni.reLaunch({ url: '/pages/login/index' })
                        }, 1500)
                    }
                } else if (response.statusCode == 401) {
                    // #ifdef MP-WEIXIN
                    // wxMPLogin()
                    // #endif
                    // #ifdef H5
                    // wxH5Login(false, 401)
                    // #endif      
                    // #ifdef APP-PLUS
                    // 清除缓存
                    // 改变登录状态
                    // $store.commit('changeLogin', false)
                    // 用户信息为空
                    // $store.commit('setUserInfo', {})
                    // uni.navigateTo({ url: '/pages/loginAgreement/loginAgreement' })
                    // #endif                              
                } else if (response.statusCode == 500) {
                    console.log('500错误')
                    uni.showToast({
                        title: '接口出错了,请稍后再试',
                        icon: 'none'
                    })
                } else if (response.statusCode == 400) {
                    console.log('400错误')
                    uni.showToast({
                        title: '接口出错了,请稍后再试',
                        icon: 'none'
                    })
                } else if (response.statusCode == 400003) {
                    uni.showToast({
                        title: '请登录,1秒后自动跳转登录',
                        icon: 'none'
                    })
                    // 清除缓存
                    uni.removeStorage({ key: 'isLogin' })
                    uni.removeStorage({ key: 'token' })
                    uni.removeStorage({ key: 'userInfo' })
                    setTimeout(() => {
                        uni.reLaunch({ url: '/pages/login/index' })
                    }, 1500)
                }

                uni.hideLoading()
            },
            fail(err) {
                console.log('interceptor-fail', err)
                setTimeout(function() {
                    uni.hideLoading()
                }, 5000)
            },
            complete() {}
        })
    })
}

操作步骤

所有的请求真机运行到安卓上和模拟器都报错。设置了 sslVerify: false 这个属性后,模拟器可以了,安卓手机还是不行。

预期结果

请求成功。

实际结果

实际一直失败。

bug描述

uniapp 运行到真机请求接口报错 request:fail abort statusCode:-1,Android 内部错误。H5 和模拟器都没有问题。


3 回复

是不是部分按住哦机器不认识了?看 ssl 证书是否过期了,换一个厂商的 ssl 证书试试,

针对您提到的uni-app在真机运行时请求接口报错,而H5和模拟器均正常的问题,这通常与真机的网络权限、请求配置或Android系统内部错误有关。以下是一些可能的解决方案和代码示例,您可以根据实际情况进行调整和测试。

1. 检查网络权限

首先,确保您的Android应用具有访问网络的权限。在manifest.json文件中,检查或添加以下网络权限配置:

"mp-weixin": {
  "appid": "your-app-id",
  "setting": {
    "urlCheck": false
  },
  "permission": {
    "scope.userInfo": {
      "desc": "你的用户信息将用于小程序登录"
    },
    "scope.userLocation": {
      "desc": "你的位置信息将用于小程序定位"
    },
    // 添加网络权限
    "android.permission.INTERNET": {
      "desc": "允许程序访问网络"
    }
  }
}

注意:上述配置示例是针对微信小程序的,如果您是原生Android应用或其他平台,请根据相应平台的文档调整。

2. 检查请求配置

确保您的请求配置正确,包括URL、请求方法、头部信息等。以下是一个使用uni.request的示例:

uni.request({
    url: 'https://your-api-endpoint.com/data',
    method: 'GET',
    header: {
        'Content-Type': 'application/json'
    },
    success: (res) => {
        console.log('请求成功', res.data);
    },
    fail: (err) => {
        console.error('请求失败', err);
        if (err.statusCode === -1) {
            // 特殊处理Android内部错误
            uni.showToast({
                title: '网络异常,请检查网络连接',
                icon: 'none'
            });
        }
    }
});

3. 捕获并处理错误

在fail回调中,您可以根据错误码进行特殊处理,如上述示例中的statusCode === -1

4. 调试和日志

  • 开启调试:在真机上开启开发者调试,查看更详细的错误信息。
  • 日志记录:在请求失败时记录详细的错误日志,包括请求参数、响应信息等,以便于问题分析。

5. 更新和兼容性

  • 确保您的uni-app和相关依赖库已更新到最新版本。
  • 检查API端点是否支持Android真机的请求。

通过上述步骤,您应该能够定位并解决真机运行请求接口报错的问题。如果问题依旧存在,建议查看uni-app的官方文档或社区论坛,寻找是否有其他开发者遇到并解决了类似的问题。

回到顶部