Python+requests 之urlencode編碼與解碼

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=小蠻腰
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章