近期项目中遇到一个bug,其中解决过程比较有意思,特此记录下来。有一天看到报警记录有一个500服务端的错误,量很少,一周都不一定有一个,先根据服务器里的本地日志拿到了当时请求的相关信息像UA、cookie什么的,确定了请求是来自iPhone上的qq浏览器,因为我们业务在手机浏览器里没有入口,所以这种情况很少。于是找来iPhone下载QQ浏览器尝试复现问题。

bug情景复现

描述:iPhone中某些版本的QQ浏览器中提交订单时,报错提示服务端异常,经抓包排查发现提交订单时post请求的body为空,content-length为0,于是开始了这次艰难蛋疼的bugfix过程。

其中手机是iPhone 8p,QQ浏览器版本9.1.0.4110,ios版本11.0,请求UA是Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0 MQQBrowser/9.1.0 Mobile/15B87 Safari/604.1 MttCustomUA/2 QBWebViewType/1 WKType/1。(虽然这些对这次后期排查修复都没什么蛋用,但有时还是很有用的)。

思路

个人喜欢debug时用排除法,先确定问题所在

  1. 首先排查发post请求过程有没有问题,因为有可能依赖的某个包在国产QQ浏览器上有兼容性问题,但一路排查发起过程都没什么问题,最后不用依赖包,直接用XMLHttpRequest手写了个post请求依然不好使,排除了发请求的依赖包的问题。

  2. 排查项目是否对发请求有影响,有些内部的监控上报的包可能会对XMLHttpRequest中方法做改写,于是一路删除怀疑的依赖包,最后单纯返回了一个简单页面,页面内发一个post请求,body依然为空,至此排除了所有依赖包的影响(这个过程很费时间,这个思路不是很好)。

  3. 排查到这就有点蛋疼了,Google搜了下看有没有人和我遇到同样的问题,发现qq浏览器论坛上17年就有人提出这个问题了,相似的帖子大概有七八个,但有官方回应的也就一两个,回复也只是说让升级浏览器。。。用户升级浏览器还行,开发者得解决问题啊,排查到这已经确定了一点,就是qq浏览器肯定对post请求的支持是有问题的。

  4. 意识到qq浏览器有问题,下意识想针对qq浏览器做下兼容处理。开始想post改成get请求,但是post中的body不是简单地数据结构,如果是以下数据改成get还好,如:

     body{name: 'frontend',age: '8',}
    复制代码

但是遇到较为复杂的数据结构就不好使了,如:

  {times: [123,234,2423,12],favour: {detail: 'sdadfa',}}
复制代码

因为改成get后是通过query来传递数据的,query是只支持字符串的;另外这种方式隐隐约约感觉会坑很大,所以排除了这种方式。于是尝试另一种方式,把body数据放到header里面,反正HTTP协议里对header大小是没做限制的,所以这样干的

  const xhr = new XMLHttpRequest();xhr.setRequestHeader({x-body: JSON.stringify(body),})
复制代码

服务端接收时再判断header中是否有x-body,当时想的这种方式是可行的,但现实很残酷,这种方式测试时发现抓包都抓不到,说明请求都没发出来,把body数据改小点,测试是可以的,这说明qq浏览器对header里数据大小是有限制的,(这就是理论与现实的矛盾的问题,http协议其实对这些都是没有限制的,但各个浏览器会有各自不同的限制),这种方式也宣布流产,此时已经中度蛋疼了。

  1. 后来想POST请求body为空这种问题还是性质挺严重的,其他页面是不是有这种问题呢?在别人页面打开找post请求发现人家的请求是有body的,这就说明我们项目中是肯定有问题的,但是同时有其他人反馈有过这种问题,说明qq浏览器也是有问题的。
  2. 既然这边不好debug到具体原因,那就向qq浏览器反馈下吧。先是向qq浏览器论坛提交了反馈,但是看之前帖子无人回应,估计这次反馈也会迟迟得不到回应;又找了QQ浏览器的反馈群,在群里反馈这个问题,这个回应还是比较快的,一天以后就有人回应了,在提供了问题页面,复现版本后,qq浏览器那边首先回应是让升级浏览器看好不好使,我是开发者啊,保留现场还来不及呢怎么再去破坏现场,把这种敷衍怼回去后,他们认真帮复现了下,最后确认了问题是旧版本的一个bug,最新的9.1.1上已经解决了,事情到这总算有个眉目了,但是还没算解决啊,他们回应说要么提醒用户升级到最新浏览器,要么页面请求时,服务器响应一个content-type,我擦,我们的问题终于出现了,这说明我们页面请求时没有返回content-type啊,他们解释说页面返回时没有带content-type,导致识别有问题。我检查了下果然没有返回content-type,之前一直纠结在接口请求上了,却忽视了页面请求时的header内容。
  3. 问题找到了,也便容易解决了,在项目服务端渲染返回页面时加上了content-type,顺手向项目用的脚手架提了issue和pr。至此问题终于算是解决了

总结

问题就是qq浏览器中post请求时body为空,需要在页面返回时有content-type,否则在一些版本的qq浏览器中会识别有问题,导致body为空。

在这个过程中,我意识到两个问题

  1. 遇到问题,特别是比较难解决的问题,一定不要轻易放弃,深挖下去总能有些意想不到的东西,这就是经验,而且解决了也会有成就感。
  2. 遇到不是很有思路的问题,不要慌,不要轻易用打补丁做兼容的方式来解决问题,比如post改get,且不说语义不对,代码不优雅,后期也有可能带来其他问题。还是要找问题的根源从而解决问题。

bug修复录-qq浏览器中post请求时body为空相关推荐

  1. 手机QQ浏览器的HTML管理器,手机qq浏览器中文件管理器有哪些功能

    手机qq浏览器中文件管理器有哪些功能 QQ浏览器是我们现在经常使用的浏览器一,其中的文件管理器功能非常的多.今天小编跟大家分享的是手机QQ浏览器文件管理器有哪些作用. 具体如下: 1. 首先我们打开手 ...

  2. 显示计算机窗口地址栏,电脑QQ浏览器中在地址栏显示最常访问功能怎么开启

    电脑QQ浏览器中在地址栏显示最常访问功能怎么开启 腾讯视频/爱奇艺/优酷/外卖 充值4折起 QQ浏览器是我们现在经常在电脑上使用的浏览器软件之一,为了方便我们的访问我们可以开启浏览器中的在地址栏显示最 ...

  3. Flex布局在QQ浏览器中的问题

    我遇到这种问题, Flex布局在QQ浏览器中父级元素滚动条无法随着子元素高度增加而出现: 如图所示,子元素comment-item随着内容高度而变大时,父级元素history-comment的滚动条未 ...

  4. 计算机中pdf怎么预览,如何在浏览器中开启PDF时默认显示Adobe Reader XI工具栏

    如何在浏览器中开启PDF时默认显示Adobe Reader XI工具栏_电脑基础知识_IT/计算机_资料 3682人阅读|3次下载 如何在浏览器中开启PDF时默认显示Adobe Reader XI工具 ...

  5. PDF:解决从PDF中复制文字时出现的空方框问题

    PDF:解决从PDF中复制文字时出现的空方框问题 目录 解决问题 解决思路 解决问题 解决从PDF中复制文字时出现的空方框问题 解决思路 将该pdf文档另存为html格式,然后打开html文件,复制文 ...

  6. 在浏览器中使用flash,例如在qq浏览器中使用flash应用等

    1.要在如下位置打开qq 空间,再打开qq指定的应用,例如qq农场,需要做好如下设置: 2. 在360安全卫士中指定使用的默认浏览器: "打开电脑中的[360安全卫士]软件,找到[功能大全] ...

  7. ASP.NET Core SameSite 设置引起 Cookie 在 QQ 浏览器中不起作用

    最近在发布了基于 ASP.NET Core 实现的新版登录页面之后,陆陆续续地接到用户反馈登录时 Antiforgery Token 总是验证失败. 日志中记录的对应错误是 今天在 QQ 浏览器中将内 ...

  8. qq邮件html样式错乱,QQ浏览器中页面出现莫名错乱原因分析

    上周在做东家内部点餐系统,页面开发完成时发现,在装有QQ浏览器的手机上查看效果发现页面错乱了.当时想找原因,因为是妹子的手机又将近下班就担阁了.今天上班第一件事就是找到这BUG,查找官方相关资料发现, ...

  9. QQ浏览器使用axios上传文件为空的问题

    记录一下这几天费尽心力解决的一个bug,关于axios库的. 这是我使用antd库的Input组件自定义的上传函数 这是上传的文件,这里嵌入了一个裁剪的小插件clipic,问题发生在裁剪完成之后,在下 ...

最新文章

  1. windows-oracle下载安装,简单的启动使用。
  2. 互联网晚报 | 4月08日 星期五 | 国家网信办:互联网企业近半年来用工人数保持平稳;特斯拉将推出一款“专用的”自动驾驶出租车...
  3. 掌握Java的内存模型,你就是解决并发问题最靓的仔
  4. 为什么大厂们 一边裁员,一边招人。。
  5. clion 插件_IDEA必备插件系列-Rainbow
  6. python用turtle画菱形_使用 Python Turtle 设计简单而又美丽的图形
  7. 机器学习实战(二)决策树DT(Decision Tree、ID3算法)
  8. matlab打开慢的原因,Matlab运行速度/效率受哪些因素影响?
  9. LDAP学习小结【仅原理和基础篇】
  10. 梦三国解析服务器spl文件头失败怎么解决,梦三国 卡顿问题的解决方法
  11. 宽容那些与我们不同的人
  12. 如何将xlsx表格文件转换成txt文件?
  13. 独立显卡安装ubuntu
  14. 学习 《模型思维》-斯科特·佩奇 笔记 9.26
  15. 回归本心QwQ背包问题luogu1776
  16. 《THE BASIC GRAMMER OF C》
  17. 动手学数据分析-数据可视化
  18. Spotlight On Oracle安装和使用
  19. 落单的数IV --- lintcode 824
  20. 专访模组厂商:人脸识别中单摄像头和双摄像头该如何选型

热门文章

  1. winform 基础
  2. Java下利用Jackson进行JSON解析和序列化
  3. 2、.net NVelocity中原生javascript ajax封装使用
  4. 高效使用Vector
  5. TabHost 两种使用方法 直接让一个Activity 继承TabActivity 和 利用findViwById()方法取得TagHost组件...
  6. IE与Firefox的CSS兼容
  7. DataTable 的 JSON 序列化
  8. day04-视图/配置文件/静态文件的基本使用
  9. 关于gradle加快构建速度采用阿里云中央仓库的配置
  10. 分享一个外星人蓝屏的问题解决方法