這兩天學習vue寫demo,沒有服務器,便抓了網易新聞的數據。vue cli3.0 + 官方推薦的axios,設置了一下代理,十分方便的在dev環境下請求到了數據。然而還沒來得及高興:
驚了!什么情況?!去網易新聞官方的頁面看來下,原來人家的是GBK頁面,不是utf-8的,而axios默認是utf-8。
一開始認為,設置請求頭,使服務器返回contentType為 'application/x-www-form-urlencoded;charset=utf-8',網上大部分文章也是這么說的。
那就改一下吧?然后一天的時間過去了...emmm....說起來你可能不信,據網上的大牛說axios的源碼中,對get請求設置進行了很不友好的生硬處理,使之一切對get請求頭的設置無效!這個bug據說存在了很長時間了,下面是github issues關於它的描述
https://github.com/axios/axios/issues/362
英文不是很好,用的翻譯功能看的。
試了很多帖子中的方法,包括什么:params.inCharset='utf-8',
params.outCharset='utf-8'
還有設置
headers里加上
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
以及添加請求攔截器什么的,各種方法我都試了,然而對我遇到的問題還是無效,可能是不太對症吧,畢竟人家樓主都采納了,應該是解決他們遇到的問題了
別人的路走不通,就想自己的辦法吧:改請求頭讓服務器直接返回utf-8是不行事兒了,畢竟插件是別人的插件,服務器是別人的服務器,全給堵死了。那就請求回來轉碼試試吧。
axios使用說明中有:responseType 表示服務器響應的數據類型
我試了一下,有效。以此為契機,有如下方法
1 responseType: 'blob', 2 transformResponse: [function (data) { 3 let reader = new FileReader(); 4 reader.readAsText(data, 'GBK'); 5 reader.onload = function (e) { 6 console.log(reader.result); 7 } 8 return data; 9 }]
讓返回類型為blob,然后按gbk編碼進行轉碼。得到:
成功!
解決方法沒寫多少,可能很簡單,可能在對協議的理解上就有錯誤,給大牛看也就是貽笑大方,但對我這個菜鳥來說真的費了不少時間。
記錄一下歷程吧,也讓有同樣遭遇的同仁能少受點苦(^-^)
如果有大牛看到了,希望告訴我在對 服務數據請求 的理解上有什么錯誤沒有,謝謝