bug修复录-qq浏览器中post请求时body为空
近期項(xiàng)目中遇到一個(gè)bug,其中解決過(guò)程比較有意思,特此記錄下來(lái)。有一天看到報(bào)警記錄有一個(gè)500服務(wù)端的錯(cuò)誤,量很少,一周都不一定有一個(gè),先根據(jù)服務(wù)器里的本地日志拿到了當(dāng)時(shí)請(qǐng)求的相關(guān)信息像UA、cookie什么的,確定了請(qǐng)求是來(lái)自iPhone上的qq瀏覽器,因?yàn)槲覀儤I(yè)務(wù)在手機(jī)瀏覽器里沒(méi)有入口,所以這種情況很少。于是找來(lái)iPhone下載QQ瀏覽器嘗試復(fù)現(xiàn)問(wèn)題。
bug情景復(fù)現(xiàn)
描述:iPhone中某些版本的QQ瀏覽器中提交訂單時(shí),報(bào)錯(cuò)提示服務(wù)端異常,經(jīng)抓包排查發(fā)現(xiàn)提交訂單時(shí)post請(qǐng)求的body為空,content-length為0,于是開(kāi)始了這次艱難蛋疼的bugfix過(guò)程。
其中手機(jī)是iPhone 8p,QQ瀏覽器版本9.1.0.4110,ios版本11.0,請(qǐng)求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。(雖然這些對(duì)這次后期排查修復(fù)都沒(méi)什么蛋用,但有時(shí)還是很有用的)。
思路
個(gè)人喜歡debug時(shí)用排除法,先確定問(wèn)題所在
首先排查發(fā)post請(qǐng)求過(guò)程有沒(méi)有問(wèn)題,因?yàn)橛锌赡芤蕾嚨哪硞€(gè)包在國(guó)產(chǎn)QQ瀏覽器上有兼容性問(wèn)題,但一路排查發(fā)起過(guò)程都沒(méi)什么問(wèn)題,最后不用依賴包,直接用XMLHttpRequest手寫(xiě)了個(gè)post請(qǐng)求依然不好使,排除了發(fā)請(qǐng)求的依賴包的問(wèn)題。
排查項(xiàng)目是否對(duì)發(fā)請(qǐng)求有影響,有些內(nèi)部的監(jiān)控上報(bào)的包可能會(huì)對(duì)XMLHttpRequest中方法做改寫(xiě),于是一路刪除懷疑的依賴包,最后單純返回了一個(gè)簡(jiǎn)單頁(yè)面,頁(yè)面內(nèi)發(fā)一個(gè)post請(qǐng)求,body依然為空,至此排除了所有依賴包的影響(這個(gè)過(guò)程很費(fèi)時(shí)間,這個(gè)思路不是很好)。
排查到這就有點(diǎn)蛋疼了,Google搜了下看有沒(méi)有人和我遇到同樣的問(wèn)題,發(fā)現(xiàn)qq瀏覽器論壇上17年就有人提出這個(gè)問(wèn)題了,相似的帖子大概有七八個(gè),但有官方回應(yīng)的也就一兩個(gè),回復(fù)也只是說(shuō)讓升級(jí)瀏覽器。。。用戶升級(jí)瀏覽器還行,開(kāi)發(fā)者得解決問(wèn)題啊,排查到這已經(jīng)確定了一點(diǎn),就是qq瀏覽器肯定對(duì)post請(qǐng)求的支持是有問(wèn)題的。
意識(shí)到qq瀏覽器有問(wèn)題,下意識(shí)想針對(duì)qq瀏覽器做下兼容處理。開(kāi)始想post改成get請(qǐng)求,但是post中的body不是簡(jiǎn)單地?cái)?shù)據(jù)結(jié)構(gòu),如果是以下數(shù)據(jù)改成get還好,如:
body{name: 'frontend',age: '8',} 復(fù)制代碼但是遇到較為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)就不好使了,如:
{times: [123,234,2423,12],favour: {detail: 'sdadfa',}} 復(fù)制代碼因?yàn)楦某蒰et后是通過(guò)query來(lái)傳遞數(shù)據(jù)的,query是只支持字符串的;另外這種方式隱隱約約感覺(jué)會(huì)坑很大,所以排除了這種方式。于是嘗試另一種方式,把body數(shù)據(jù)放到header里面,反正HTTP協(xié)議里對(duì)header大小是沒(méi)做限制的,所以這樣干的
const xhr = new XMLHttpRequest();xhr.setRequestHeader({x-body: JSON.stringify(body),}) 復(fù)制代碼服務(wù)端接收時(shí)再判斷header中是否有x-body,當(dāng)時(shí)想的這種方式是可行的,但現(xiàn)實(shí)很殘酷,這種方式測(cè)試時(shí)發(fā)現(xiàn)抓包都抓不到,說(shuō)明請(qǐng)求都沒(méi)發(fā)出來(lái),把body數(shù)據(jù)改小點(diǎn),測(cè)試是可以的,這說(shuō)明qq瀏覽器對(duì)header里數(shù)據(jù)大小是有限制的,(這就是理論與現(xiàn)實(shí)的矛盾的問(wèn)題,http協(xié)議其實(shí)對(duì)這些都是沒(méi)有限制的,但各個(gè)瀏覽器會(huì)有各自不同的限制),這種方式也宣布流產(chǎn),此時(shí)已經(jīng)中度蛋疼了。
總結(jié)
問(wèn)題就是qq瀏覽器中post請(qǐng)求時(shí)body為空,需要在頁(yè)面返回時(shí)有content-type,否則在一些版本的qq瀏覽器中會(huì)識(shí)別有問(wèn)題,導(dǎo)致body為空。
在這個(gè)過(guò)程中,我意識(shí)到兩個(gè)問(wèn)題
總結(jié)
以上是生活随笔為你收集整理的bug修复录-qq浏览器中post请求时body为空的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: nginx 认证多个客户端的问题
- 下一篇: vue[源码]你不知道的observe!