我使用Python 3和requests模塊/庫來查詢REST服務。python3請求使用quote而不是quote_plus
看起來默認請求使用urllib.parse.quote_plus()
進行urlencoding,即空格轉換爲+
。
但是,我查詢的REST服務將其誤解爲and
。所以我需要將空格編碼爲%20
,即使用urllib.parse.quote()
代替。
有沒有一種簡單的方法來處理請求?我在文檔中找不到任何選項。
我使用Python 3和requests模塊/庫來查詢REST服務。python3請求使用quote而不是quote_plus
看起來默認請求使用urllib.parse.quote_plus()
進行urlencoding,即空格轉換爲+
。
但是,我查詢的REST服務將其誤解爲and
。所以我需要將空格編碼爲%20
,即使用urllib.parse.quote()
代替。
有沒有一種簡單的方法來處理請求?我在文檔中找不到任何選項。
原來你可以!
from requests.utils import requote_uri
url = "https://www.somerandom.com/?name=Something Cool"
requote_uri(url)
'https://www.somerandom.com/?name=Something%20Cool'
documentation here requote_uri方法大約在頁面的一半處。
謝謝。你是對的,但是這樣我就放棄了只需要將一個字典作爲'params'添加到requests.get(url,params = dict)的好的請求功能,因爲requote_uri顯然需要整個url。用Urllib代替,你可以處理一個字典:'urllib.parse.urlencode(dict,safe ='/',quote_via = urllib.parse.quote)''。那是對的嗎? – absurd
這是正確的。請求庫在內部使用'urllib.parse.urlencode()','quote_via'參數設置爲'quote_plus'。我一直在研究是否有辦法通過'requests.get()'通過管道傳遞這個選項,看起來這是不可能的。幾年前,我發現[這個問題的線索](https://github.com/kennethreitz/requests/issues/369),導致我相信,由於他們處理百分比的困難,他們最終選擇了quote_plus路由。 (雖然這可以被認爲是一個巨大的飛躍) – Neelik
謝謝。那麼,我現在正在考慮切換回urllib。 – absurd
您可以在將它傳遞到請求之前使用'urllib.parse.quote()'嘗試對URL進行編碼。由於它已經被編碼,所以請求不會嘗試進一步的格式化。 – Neelik
謝謝,這個作品。但是,我可以只使用request/urllib3來做到這一點,並避免加載另一個模塊(urllib)? – absurd