為什么要對url進行編碼
- url有規范,在參數值中出現&字符會截斷參數
- url中文的問題,編碼客轉換為英文
- 也是第一種情況,url中有個參數值是url,傳輸的時候會出現錯誤
例1
有這樣一串參數: name1=value1&name2=value2
我們來說一下客戶端到服務端的概念上解析過程, 上述字符串在計算機中用ASCII碼表示為:
6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532
對應關系: 6E616D6531 --> name1 3D --> =
76616C756531 --> value1
26 --> &
6E616D6532 --> name2
3D --> =
76616C756532 --> value2
服務端在接收到該數據后就可以遍歷該字節流,首先一個字節一個字節的吃,當吃到3D這字節后,服務端就知道前面吃得字節表示一個key,再想后吃,如果遇到26,說明從剛才吃的3D到26子節之間的是上一個key的value,以此類推就可以解析出客戶端傳過來的參數。
現在有這樣一個問題,如果我的參數值中就包含=或&這種特殊字符的時候該怎么辦?
比如說“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么實際在傳輸過程中就會變成這樣“name1=va&lu=e1”。我們的本意是就只有一個鍵值對,但是服務端會解析成兩個鍵值對,這樣就產生了奇異。
如何解決上述問題帶來的歧義呢?
解決的辦法就是對參數進行URL編碼
URL編碼只是簡單的在特殊字符的各個字節前加上%,例如,我們對上述會產生奇異的字符進行URL編碼后結果:“name1=va%26lu%3D”,這樣服務端會把緊跟在“%”后的字節當成普通的字節,就是不會把它當成各個參數或鍵值對的分隔符。
例2
一個接口,你傳送過去時,需要帶上你這邊的回調地址,也是個url. 這樣你不能url+url傳送,需要一個urlencode把回調地址編碼,防止發生問題
例如: 微信的一個接口
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
REDIRECT_URI 這裡應該填你的服務器回調地址.正常寫法如 http://api.baidu.com/callback.php
那么生成的接口就是
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=http://api.baidu.com/callback.php&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
這樣訪問肯定出問題...
那么http://api.baidu.com/callback.php 這個回調地址, 就要轉碼后(encodeURIComponent)再放到地址中發送.
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=http%3A%2F%2Fapi.baidu.com%2Fcallback.php&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
文章參考:
http://blog.csdn.net/chanda_yang/article/details/52422575
https://segmentfault.com/q/1010000002991580
https://www.zhihu.com/question/19673368