urlencode編碼 — 為什么要編碼


原文鏈接:https://blog.csdn.net/stpeace/article/details/82892571

參考:https://blog.csdn.net/z69183787/article/details/35987711

web客戶端通過http post提交數據到web服務端,其中一個字段名是content, 部分js代碼如下:

var xmlHttp = new XMLHttpRequest();
xmlHttp.open('post', 'http://localhost:8080/heheda')
xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded")
xmlHttp.send('content=' + str)

 go gin做web服務端, 一切工作的好好的。

      可是,實際發現,web服務端概率取不到content的內容,快速確認了一下, 比如當str="abc%"的時候,web服務端就取不到這個值。

   然而,tcpdump抓包的內容顯示有這個字段啊: content=abc%

       也就是說,"abc%"的確傳遞到了web服務端,  怎么就取不出這個值呢?

       要注意:content參數在傳遞后, web服務端默認content參數進行了urlencode, 所以接受到"abc%"后, web服務端的gin框架對"abc%"進行urldecode,  很顯然,獨立的"%"服務解析出錯(特殊字符), 所以在web服務端的代碼中取不到"abc%"

       那如果確實要傳遞"abc%", 怎么辦呢?先進行urlencode吧,對應的串是"abc%25",  此時"content=abc%25",  tcpdump抓包也能看到這個串"content=abc%25", 而在web服務端解析出來的content的內容abc% (web服務端自動進行了urldecode后)

        回到題目那個問題, 為什么要urlencode呢?

        假設我們在http post請求中要傳遞的內容為"name1=xxx&name2=yyy", 如果xxx的內容為"lucy&key=hehe", 那么整個串就成了"name1=ucy&key=hehe&name2=yyy", 很顯然,明明是兩個字段,卻變成了3個字段, 任何人都無法把原來的正確字段提取出來,一切都是"lucy&key=hehe"在搗鬼,所以,要對"lucy&key=hehe"進行轉化,進行urlencode, 免得與"&","="產生沖突。

      想一下, 不進行urlencode, 而進行base64編碼可以嗎?當然可以,只不過,需要自己去base64解碼。相比較而言,urlencode就要好很多, web服務端會自己去進行urldecode, 更爽。

      最后,要注意html form表單的post請求會默認進行urlencode, 可以抓包試試看。想一想,為什么要怎么做?

為什么需要Url 編碼
1.  Url 中有些字符會引起歧義 , =,& 號等
2.  Url 的編碼格式采用的是ASCII 碼,而不是Unicode ,這也就是說你不能在Url 中包含任何非ASCII 字符,例如中文

哪些字符需要編碼
RFC3986 文檔規定,Url 中只允許包含英文字母(a-zA-Z )、數字(0-9 )、-_.~4 個特殊字符以及所有保留字符。
Url 可以划分成若干個組件,協議、主機、路徑等。RFC3986 中指定了以下字符為保留字符: ! * ' ( ) ; : @ & =+ $ , / ? # [ ]


免責聲明!

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



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