uni-app 真机运行请求接口报错 request:fail abort statusCode:-1 Android internal error H5和模拟器均正常
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 和模拟器都没有问题。
同问
是不是部分按住哦机器不认识了?看 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的官方文档或社区论坛,寻找是否有其他开发者遇到并解决了类似的问题。