URL編碼
URL編碼是一種瀏覽器用來打包表單輸入的格式; 瀏覽器從表單中獲取所有的name和其中的值, 將它們以name/value參數編碼(移去那些不能傳送的字符, 將數據排行等等) 作爲URL的一部分或者分離地發給服務器
爲什麼需要urlencode編碼
原因:如果一樣東西需要編碼, 說明其並不適合直接傳輸。原因多種多樣, 如Size過大, 包含隱私數據。對於Url來說, 之所以要進行編碼, 是因爲Url中有些字符會引起歧義。
例如:URL參數字符串中使用key=value鍵值對這樣的形式來傳參,鍵值對之間以&符號分隔,如/s?q=abc&ie=utf-8。如果你的value字符串中包含了=或者&,那麼勢必會造成接收Url的服務器解析錯誤,因此必須將引起歧義的&和=符號進行轉義,也就是對其進行編碼
工具推薦:站長工具URL在線編碼與解碼
運用場景
在用Python+requests做接口自動化過程中,http協議在發送url的時候,是以urlencode的編碼格式傳過去的,通常requests
庫會幫我們自動處理了。但是某些特殊情況下我們就需要通過其他的方法處理編碼與解碼的問題。
比如:
1. 服務端返回的url地址,有時候是以urlencode的編碼傳過來的,我們需要從url上提取一些參數信息,這時候就需要對url解碼
2. 登錄功能中涉及到JavaScript中的回調函數(callback),把需要回調的URL(帶參數)傳參給後端接口, 這時就需對傳參的url編碼
Python之urllib.parse
urllib.parse 裏面三個方法:urlencode、quote 和 unquote, 分別參數編碼與解碼
urlencode編碼
如果我們想自己操作,對字符串傳入的字典參數進行urlencode編碼,就需要用到兩個方法urlencode和quote
urlencode
urlencode方法能對字典編碼,如下:
#!/usr/bin/python3
# coding=utf-8
# Author: sitven
from urllib.parse import urlencode
payload = {
"content": "中文內容信息",
"charsetSelect": "utf-8",
"en": "UrlEncode編碼"
}
print(urlencode(payload))
運行結果:
content=%E4%B8%AD%E6%96%87%E5%86%85%E5%AE%B9%E4%BF%A1%E6%81%AF&charsetSelect=utf-8&en=UrlEncode%E7%BC%96%E7%A0%81
quote
quote方法能對字符串編碼,如下:
#!/usr/bin/python3
# coding=utf-8
# Author: sitven
from urllib.parse import quote
print(quote("張大款"))
url = "http://www.baidu.com/?a=張大款&b=sitven"
print(quote(url))
運行結果:
%E5%BC%A0%E5%A4%A7%E6%AC%BE
http%3A//www.baidu.com/%3Fa%3D%E5%BC%A0%E5%A4%A7%E6%AC%BE%26b%3Dsitven
urlencode解碼
若返回的數據裏面有urlencode編碼的字符串, 類似於%E4%B5%B7&b=E6%82%A0這種格式, 可通過unquote方法解碼
unquote
unquote方法解碼,如下:
#!/usr/bin/python3
# coding=utf-8
# Author: sitven
from urllib.parse import unquote
import requests
url = "http://httpbin.org/get"
payload = {
"city": "廣州",
"site": "小蠻腰"
}
r = requests.get(url, params=payload)
print(r.url)
print(unquote(r.url))
運行結果:
http://httpbin.org/get?city=%E5%B9%BF%E5%B7%9E&site=%E5%B0%8F%E8%9B%AE%E8%85%B0
http://httpbin.org/get?city=廣州&site=小蠻腰