1. 程式人生 > 其它 >記一次介面狀態碼200但是瀏覽器解析資料失敗

記一次介面狀態碼200但是瀏覽器解析資料失敗

表象

瀏覽器表象

錯誤資訊 net::ERR_CONTENT_DECODING_FAILED 200 (OK)

排查

分析

整個流程是這樣的

ui -> 脫敏服務 -> 閘道器(底層是nginx) -> nginx -> 服務
ui呼叫脫敏服務, 脫敏服務呼叫閘道器, 閘道器負載nginx, nginx再負載服務, 這條鏈路, 就會報上面的錯誤

ui -> 脫敏服務 ->閘道器(底層是nginx) -> 服務
ui呼叫脫敏服務, 脫敏服務呼叫閘道器, 閘道器直接負載服務, 這條鏈路, 就不會報錯

直接呼叫介面是好的, curl等, 但是在瀏覽器中就會報錯
於是對比了兩種方式, 響應header的內容

net::ERR_CONTENT_DECODING_FAILED 200 (OK)
再加上報錯的內容, 雖然http狀態碼200了, 但是瀏覽器解析失敗,
但是直接呼叫介面是好的, 說明資料不對, 導致瀏覽器解析不了
對比了一下, 在response headers中, 一個有content-encoding: gzip
一個沒有, 所以
懷疑資料gzip的格式出了問題, 所以瀏覽器解析資料失敗
因為請求頭裡接受編碼的方式有gzip, nginx開啟了gzip, 所以響應頭裡給了gzip的編碼方式
但是又因為返回資料的gzip格式有問題, 所以瀏覽器解析失敗

驗證

因為閘道器底層是nginx, 所以這邊格式的轉換不擔心, 於是猜想脫敏服務這一塊的轉發與gzip的關係
於是嘗試了一下新的鏈路
ui -> 閘道器(底層是nginx) -> nginx -> 服務
瀏覽器就正常了, 所以, 應該是脫敏服務的處理有些問題

修改及測試(解決)

這裡提供了思路
臨時解決的話, 就是要關閉nginx的gzip
如果要解決的話就要找到響應資料的gzip格式為何不對, 並修正