相关文章推荐
健身的煎鸡蛋  ·  web Components 学习之路 - ...·  1 年前    · 
玉树临风的口罩  ·  单挑力扣(LeetCode)SQL题:130 ...·  1 年前    · 
小胡子的小马驹  ·  vue安装关于淘宝镜像安装失败_vue.js ...·  1 年前    · 
路过的酱肘子  ·  Asp.Net Core ...·  1 年前    · 
私奔的红烧肉  ·  #Shell 脚本# awk: line ...·  2 年前    · 
Code  ›  跨平台应用开发进阶(三十六) :uniapp使用uni.request请求报错{“errMsg“:“request:fail abort statusCode:-1“}的解决办法_uni.reques
跨平台 应用开发 软件 ios网络请求
https://blog.csdn.net/sunhuaqiang1/article/details/127084774
阳刚的土豆
3 月前
    • 一、问题呈现
    • 二、问题分析
      • 2.1 手机没有连网
      • 2.2 https ssl证书解析(未得到验证)
      • 2.3 data序列化错误
      • 2.4 TCP握手超时失败
    • 三、解决办法
      • 3.1 网络检测
      • 3.2 请求封装
    • 四、拓展阅读

    一、问题呈现

    在 uniapp 中,使用 uni.request() 向服务端接口发起请求后,返回值为 :{"errMsg":"request:fail abort statusCode:-1"} ,因此,导致了后面的业务代码报错。

    通过检查 uni.request() 根据服务端接口需要的配置(如: url、data、header、method 等)都没有问题。

    二、问题分析

    2.1 手机没有连网

    在以上前提下还出现这种问题,最有可能的原因:手机没有连网,或者看着连上了网但实际网络不可用,可以在手机浏览器中随便输入点文字搜一下测试看看,能不能搜到新内容。

    仔细查看,这个 {"errMsg":"request:fail abort statusCode:-1 未能找到使用指定主机名的服务器。(-1003)"} 返回值,其实并不是服务端返回来的,因为请求都完全没有到服务端。

    2.2 https ssl证书解析(未得到验证)

    通过对比前后版本差异,发现前期后台请求方式为 http:IP 形式,当前后台请求方式为 https:域名 形式。通过 http:域名 形式检测,未发现以上现象。排除法怀疑问题出在ssl证书验证阶段。

    但是 andriod 不会出现以上问题,只有 ios 才会出现以上问题。难道 android 与 ios 在校验证书方面存在差异?

    通过抓包工具Stream分析发现,在出现网路连接问题时抓包信息如下:

    抓包详情信息如下:

    2.3 data序列化错误

    从网上看到如下解释,经过实践,发现问题解决了。

    官方文档上说 uni.request 在 content-type:application/json 时会尝试对 data 进行序列化。手动将原本是 json 的数据转成字符串传进去就可以了,希望官方可以对这一块进行优化吧。

    2.4 TCP握手超时失败

    通过 WhireShark 捕获网络层数据,发现TCP握手超时。

    并在dmz区的服务器上捕获 netstat packets rejects in established connections because of timestamp 有这个错误。

    通过系统参数优化可解决TCP握手超时问题。

    在入口服务器打开编辑文件 /etc/sysctl.conf ,加入以下内容:

    net.ipv4.tcp_tw_reuse=0
    net.ipv4.tcp_tw_recycle=0
    net.ipv4.tcp_fin_timeout=10
    net.ipv4.ip_local_port_range=1024 65535
    net.core.somaxconn=65535
    vm.drop_caches=1
    vm.swappiness=0
    fs.file-max=10485760
    

    然后执行 /sbin/sysctl -p 让参数生效。

    三、解决办法

    3.1 网络检测

    针对手机没有连网的场景,在执行uni.request()向服务端请求前,使用uni.getNetworkType()和uni.onNetworkStatusChange()对网络进行监听,如果监听到当前设备是处于无网络的状态时,就不执行uni.request()请求,而是弹出一个弹框或者消息提示,提醒用户:“当前设备断网了,请检查网络后重试”。

    uni. onNetworkStatusChange
    触发时机:在网络切换的时候执行,切换2G,3G,WiFi的时候会执行。
    应用时机:一般都会放在 onShow里面,实时监听网络的切换。当应用关闭后台的时候在 onHide 生命周期函数中执行 uni.offNetworkStatusChange()关闭监听网络。

    uni.getNetworkType
    触发时机:在页面初始化的时候,或者是在方法执行的时候执行。
    应用时机:可以再onShow 、onLoad这样的生命周期里面来执行,也可以在点击事件中添加执行,属于即用即取的。

    3.2 请求封装

    在使用uni.request进行网络请求时,对入参data进行JSON.stringfy()序列化操作。

    return new Promise((resolve, reject) => {
    	uni.request({
    		url: curUrl,
    		method: method || "POST",
    		header: {
    			'Content-Type': 'application/json',
    			'Authorization': 'Basic'
    		// header: headerForm,
    		data: JSON.stringfy(data) || {},
    		success(res) {
    			setToken(res.data)
    			resolve(res.data)
    			console.log('The request url(' + curUrl + ')  success return info is: ', res.data)
    		fail(err) {
    			reject(err)
    			console.log('The request url(' + curUrl + ')  fail return info is: ', err)
    		complete() {
    			// uni.hideLoading()
    }).catch(err => {
    	handleErr(err)
    

    官方文档中关于data 数据说明信息如下:

    最终发送给服务器的数据是 String 类型,如果传入的 data 不是 String 类型,会被转换成
    String。转换规则如下:

    • 对于 GET 方法,会将数据转换为 query string。例如 { name: 'name', age: 18 } 转换后的结果是 name=name&age=18。
    • 对于 POST 方法且 header['content-type'] 为 application/json 的数据,会进行 JSON 序列化。
    • 对于 POST 方法且 header['content-type'] 为 application/x-www-form-urlencoded 的数据,会将数据转换为 query string。

    四、拓展阅读

    • 《uni-app 获取网络状态》
    • 《uni-app 问题区:相同的接口IOS请求失败,errMsg":"request:fail abort statusCode:-1》
    • 《uni-app 问题区:【报Bug】uniapp使用uni.request请求报错{“errMsg”:“request:fail abort statusCode:-1”}》
    • 《uni.request 请求报文》
    • 《跨平台应用开发进阶(四十三)一文走近网络层抓包工具:WhireShark》
    • 《跨平台应用开发进阶(四十四)一文走近应用层抓包工具:Charles》
    uniapp - 解决request请求报错 request:fail abort statusCode:-1 Chain validation failed(调用服务端api接口提示错误,莫名其妙)
    先吐槽一下我的心情,我TM这会想骂人 !!!!!! 简单说明下,我使用uni-app写了一个混合app,安卓真机测试一直没问题,之前用了几个ios也测试了,没什么问题,可以正常运行。 然而昨天下午,客户过来了,需要给自己手机安装一下,回去测测效果。尴尬的事情来了,客户手机6p安装成功,打开后所有的uni-request请求直接走fail回调。。。 我TM当时整个人都是蒙的,什么鬼??? 然...
    {"errMsg":"request:fail abort statusCode:-1 Failed to connect to /192.168.1"} 就是测试的真机和电脑的wifi 不一样 切换成相同的就可以了
    为了解决浏览器的跨域问题,在vue.config.js中设置了proxy代理,在H5中请求可以正常发送和接收,但在真机APP上请求报错errMsg": "request:fail abort statusCode:-1 不支持的URL(-1002)。 去掉vue.config.js中的代理设置,如果是在manifest中设置的也同样取消掉。 在请求地址前加上baseUrl代替proxy。如果baseUrl有多个,可以在一个配置文件中单独列出,在请求方法中手动引入并加到url中。 下图是在封装
    乌鱼子这个问题卡了我几天,h5端正常,但因为真机调试时登陆无法成功无法获取uid值导致后续的工作难以进行,查了网络上后说的设置为sslVerify: false,以及uni.getNetworkType和uni.onNetworkStatusChangej检查网络后均没有解决 列一下这几天解决这个问题的几种可能: 1.手机端与pc端保证在一个局域网内 2.手机端与pc端保证在一个时区 3.请求的接口地址的写法(我问题在这): url:"http://192.168.xx.xxx:4444/use
    uni-app填坑{“errMsg“:“request:fail abort statusCode:-1“}_浮沉逆旅的博客-CSDN博客uni-app填坑{“errMsg”:“request:fail abort statusCode:-1”}遇坑当我兴高采烈的封装了一个异步请求的方法之后,赶紧写了个测试后台进行网络请求,结果当我运行程序的时候h5端正常获取到参数,但是app端却报了这样的错误。16:11:19.304 [Vue warn]: Error in onLoad hook (Promise/a
    ### 关于 `uni.saveFile` 函数调用时出现路径不存在的报错问题 当遇到 `uni.saveFile` 的失败回调返回错误码 14 表明路径不存在的情况,这通常意味着尝试保存文件到指定位置时,该路径在当前应用程序环境中不可访问或者未被正确创建。 #### 可能的原因分析 - 文件的临时路径仅在应用本次启动期间有效。如果试图在一个新的会话中使用之前获得的临时路径,则可能导致此错误[^3]。 - 如果是从其他接口(如 `wx.chooseImage` 或者类似的媒体选择功能)获取的文件路径,并直接传递给 `uni.saveFile` 进行保存操作,需要注意这些接口返回的是临时文件路径而不是永久存储路径[^1]。 #### 解决策略 为了防止因路径失效而导致的操作失败,建议采取以下措施: 1. **立即保存**:一旦通过 API 获取到了图片或其他资源的临时路径之后应尽快执行保存动作,减少由于时间差造成路径失效的可能性。 2. **检查路径有效性**:可以在调用 `uni.saveFile` 前先验证一下目标路径是否存在以及是否有写入权限等问题;虽然官方文档并没有提供直接的方法来检测路径的有效性,但是可以通过捕获异常的方式来间接实现这一点。 3. **处理异步流程中的不确定性**:考虑到 JavaScript 是单线程运行机制,在多层嵌套的异步函数之间可能会存在状态不一致的风险。因此应该确保所有的逻辑都在同一个事件循环周期内完成,即尽可能让整个过程保持同步化,尤其是在涉及到 UI 更新和数据交互的时候更要注意这个问题。 ```javascript function saveImg() { wx.chooseImage({ count: 1, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], success(res) { const tempFilePath = res.tempFilePaths[0]; // 尽量在同一事件循环期内完成后续操作 uni.saveFile({ tempFilePath: tempFilePath, success(saveRes) { console.log('Saved file path:', saveRes.savedFilePath); fail(err) { if (err.errCode === 14) { // 处理特定错误情况 console.error('Path not found or invalid.'); // 实施补救措施,比如提示用户重新选择文件等 }); }); Could not resolve all files for configuration ':react-native-screens:_internal_prefab_binary'. Could not resolve com.google.prefab:cli:2.1.0. Required by: project :react-native-screens Could not resolve com.google.prefab:cli:2.1.0. 请问我报这个错该怎样解决? ReactNative进阶(五十五):React Native与原生通信 请问,你这个的代码写到了哪个文件中?【2.1 RN 调用安卓原生组件】 ReactNative进阶(五十五):React Native与原生通信 Could not resolve all files for configuration ':react-native-screens:_internal_prefab_binary'. Could not resolve com.google.prefab:cli:2.1.0. Required by: project :react-native-screens Could not resolve com.google.prefab:cli:2.1.0. 你好,我用Android Studio打开RN项目中的android目录,报这个错误,请问怎样修复该错误? PARTLibClient.dll PARTICLES.dll ParticleDesigner.dll PARSEC.DLL MPPRO.DLL MPPLUS.DLL MPLABICE.
 
推荐文章
健身的煎鸡蛋  ·  web Components 学习之路 - 六石 - 博客园
1 年前
玉树临风的口罩  ·  单挑力扣(LeetCode)SQL题:1308. 不同性别每日分数总计 - 墨天轮
1 年前
小胡子的小马驹  ·  vue安装关于淘宝镜像安装失败_vue.js_qq_45722446-Vue
1 年前
路过的酱肘子  ·  Asp.Net Core AuthorizeAttribute 和AuthorizeFilter 跟进及源码解读-腾讯云开发者社区-腾讯云
1 年前
私奔的红烧肉  ·  #Shell 脚本# awk: line 6: syntax error at or near [ awk: line 14: syntax error at or near [-编程语言-CSDN问答
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号