之前,在開發(fā)的過程中诀黍,發(fā)現(xiàn)了一個很奇怪的問題袋坑,那就是關于get請求帶來的字符亂碼的問題,困擾了我很久眯勾,那就是在使用Get請求的時候枣宫,請求中帶了參數(shù) +
,而后吃环,后臺無論如何都收不到這個+
,只會顯示空格也颤,奇怪的是,當我把請求過來的URL
完整打印出來時卻又是正確的郁轻,基本情況可以用下面的例子展示:
完整的get請求
http://www.test.com/test?a=21398+kjad
按道理翅娶,我后臺想收到的應該是:
21398+kjad
但實際上收到的卻是:
21398 kjad
出現(xiàn)這個問題后,本以為是前端的請求出了問題好唯,于是竭沫,在后臺把請求打印出來發(fā)現(xiàn),完整的URL并沒有變骑篙,依然是上面的請求:
http://www.test.com/test?a=21398+kjad
那么蜕提,是什么原因?qū)е碌哪兀?/strong>
后來網(wǎng)上查找了一下,發(fā)現(xiàn)很多人都遇到了和我一樣的問題靶端,其實谎势,這是一個歷史性的遺留問題凛膏,這篇博客這么寫道:
html
中因為一些非標準的做法,將+
等同于空格
進行處理 (當Html
的表單被提交時它浅,每個表單域都會被Url
編碼之后才在被發(fā)送译柏。由于歷史的原因,表單使用的Url
編碼實現(xiàn)并不符合最新的標準姐霍。例如對于空格使用的編碼并不是%20
鄙麦,而是+
號,如果表單使用的是Post
方法提交的镊折,我們可以在HTTP
頭中看到有一個Content-Type
的header
胯府,值為application/x-www-form-urlencoded
,大部分應用程序均能處理這種非標準實現(xiàn)的Url
編碼)恨胚。
可以看到骂因,其實,當后端收到+
后赃泡,會以為是空格的編碼寒波,從而將其轉(zhuǎn)換成了空格。(一般來講升熊,服務器會默認幫你做了這些處理的)
** Angular2中的坑 **
眼看著問題似乎解決了俄烁,于是乎,在Angular2中级野,我在使用params設置鍵值的時候页屠,將鍵值encodeUrlComponent
了一下,本來準備坐等勝利的果實蓖柔,結(jié)果卻又仿佛一場噩夢:
后臺依然有空格3狡蟆!况鸣!
徘徊了許久牢贸、嘗試了多次,依然不行镐捧,百無聊賴潜索,只能看源碼了:
在使用URLSearchParams
對象設置鍵值的時候,Angular2中的源碼對字符有如下處理:
function standardEncoding(v) {
return encodeURIComponent(v)
.replace(/%40/gi, '@')
.replace(/%3A/gi, ':')
.replace(/%24/gi, '$')
.replace(/%2C/gi, ',')
.replace(/%3B/gi, ';')
.replace(/%2B/gi, '+')
.replace(/%3D/gi, '=')
.replace(/%3F/gi, '?')
.replace(/%2F/gi, '/');
}
看到這兒愤估,真的忍不住想吐血帮辟,心里暗罵了angular2
一百遍。
大家看出什么問題了嗎玩焰?
是的由驹,它把我辛辛苦苦轉(zhuǎn)化的%2B
又給轉(zhuǎn)換回去了!!B并炮!
寫到這里,我真的沒有明白甥郑,Angular2
為什么要這么做逃魄,浪費了我好多時間。
最后的解決方法也很簡單很暴力了澜搅,直接自己拼接encodeUrlComponent
后的字符伍俘,不使用URLSearchParams
對象。