在項(xiàng)目里剛好有3個(gè)服務(wù),同一個(gè)網(wǎng)關(guān)內(nèi)層的3個(gè)服務(wù),兩個(gè)php的,一個(gè)golang的,為了提高負(fù)載以及進(jìn)行分流,部分客戶的接口調(diào)用會(huì)被網(wǎng)關(guān)自動(dòng)分配到go服務(wù)。
恰好為了測(cè)試,我寫了一個(gè)全量用戶的生產(chǎn)、測(cè)試環(huán)境調(diào)用接口返回結(jié)果進(jìn)行對(duì)比的腳本,于是發(fā)現(xiàn)了題中的問題:兩個(gè)php服務(wù)里的接口返回值寫入xlsx后,直接copy出來(lái)是正常的json串,golang的接口返回值copy出來(lái)變成雙重引號(hào)如圖
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-449226.html
排查過(guò)程:
1、先通過(guò)python的requests請(qǐng)求接口直接打印出返回值,看看是否是兩個(gè)雙引號(hào),結(jié)果發(fā)現(xiàn)php跟go服務(wù)都是正常的json串。
?
2、繼續(xù)排查,猜想問題會(huì)不會(huì)出現(xiàn)編碼傳輸格式上,于是對(duì)比php跟go接口響應(yīng)標(biāo)頭。
php服務(wù)響應(yīng)頭如下:
go服務(wù)應(yīng)頭如下
go跟php響應(yīng)頭的差別只在于兩點(diǎn):php多了TimeStamp,Content-Type里面多了charset=utf-8。
首先排除TimeStamp,從名稱上就可以看出來(lái)不會(huì)對(duì)返回值格式或內(nèi)容有任何影響;
然后嘗試用flask編寫兩個(gè)接口,Content-Type里面分別為application/json、application/json; charset=utf-8,寫入excel后發(fā)現(xiàn)并沒有任何不同。
?
3、響應(yīng)頭也沒問題,繼續(xù)猜想會(huì)不會(huì)是go服務(wù)代碼缺陷,接口在return response之前并沒有序列化,而是直接返回了object對(duì)象?
我們先了解一個(gè)概念:序列化與反序列化。
序列化是把程序?qū)ο筠D(zhuǎn)換為字節(jié)序列的過(guò)程,反序列化就是把字節(jié)序列恢復(fù)為程序?qū)ο蟮倪^(guò)程。
因?yàn)椴煌目蛻舳?、服?wù)端可能使用的語(yǔ)言不同,為了兼容都是用序列化之后的數(shù)據(jù)進(jìn)行傳輸,比如前端js將頁(yè)面參數(shù)序列化之后傳遞給后端java服務(wù)。
開始實(shí)驗(yàn),本地flask直接返回字典{"username": username, "password": password},寫入excel的居然真的出現(xiàn)了兩個(gè)雙引號(hào)。
?
4、于是讓開發(fā)排查代碼里是不是沒有作序列化,但是出人意料的是,go代碼里是做了序列化才返回的。
所以上面的猜想都不成立,研究一度陷入僵局,直到...
?
5、偶然注意到copy出來(lái)的返回值尾巴上有個(gè)莫名其妙的換行。
根據(jù)以前經(jīng)常寫json數(shù)據(jù)入csv、xlsx文件的經(jīng)驗(yàn),就算是格式化后加了多個(gè)引號(hào)的json數(shù)據(jù)(例如pandas的to_csv方法里的quoting參數(shù)即可控制是否加引號(hào)),也不可能加換行符。
所以猜想會(huì)不會(huì)是返回值多了個(gè)隱形的換行符,然后在pacharm的cmd里調(diào)一下接口看看,果然go服務(wù)返回體尾巴上換行了,而php則不會(huì)
?
6、于是在寫入excel之前把返回值rstrip()一下做最后的確認(rèn),結(jié)果從excel復(fù)制出來(lái)的數(shù)據(jù)真的沒有多重引號(hào)了。
?
至此,揪出來(lái)這個(gè)go服務(wù)的bug!文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-449226.html
?
到了這里,關(guān)于記一次排查:接口返回值寫入excel后,從單元格copy出來(lái)的數(shù)據(jù)會(huì)帶有多重引號(hào)的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!