前端為什么要對url進行編碼


為什么要對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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM