2017-09-05 14 views
1

我使用Python請求調用使用API​​之間URL變化GETPython的請求 - 參數數量爲文本VS PARAMS作爲字典

我使用HMAC和hashlib導致看起來像一個簽名生成的簽名:

4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%3D 

當我使用Requests並將參數指定爲字符串時,API調用成功,因爲簽名按原樣使用並且不會更改。

但是,當我使用請求並將參數指定爲字典時,上面的簽名再次被URL編碼,導致%被編碼爲%25,導致簽名顯示如下(注意%25):

4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%253D 

更多的上下文,這裏是字符串PARAMS:

url = 'https://example.com/API' 
payload = '&parameterA=valueA&parameterB=valueB&parameterC=valueC& apikey='+apikey+'&salt='+salt+'&signature='+sig 
#payload = {'parameterA': 'valueA', 'parameterB': 'valueB', 'apikey': apikey, 'salt': salt, 'signature': sig} 
r = requests.get(url, params=payload) 
print r.url 

結果的URL:

https://example.com/API& 
&parameterA=valueA 
&parameterB=valueB 
&apikey=0e1026af-40ce-e354-f1f2-72d280ca122 
&salt=12345 
&signature=4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%3D 

現在,詞典PARAMS:

url = 'https://example.com/API' 
payload = {'parameterA': 'valueA', 'parameterB': 'valueB', 'apikey': apikey, 'salt': salt, 'signature': sig} 
r = requests.get(url, params=payload) 
print r.url 

結果的URL:

https://example.com/API 
&signature=4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%253D 
&salt=12345 
&apikey=0e1026af-40ce-e354-f1f2-72d280ca122 
&parameterA=valueA 
&parameterB=valueB 

注意再次,在簽名%變爲25個%

謝謝!

回答

1

將字典傳遞到params時,它獲取了url編碼。你的字符串已經被url編碼了,所以它得到了雙重編碼,導致格式不正確的'簽名'。
您可以使用urllib.unquote解碼sig(或者你可以用'='取代'%3D'

payload = { 
    'parameterA': 'valueA', 'parameterB': 'valueB', 
    'apikey': apikey, 'salt': salt, 'signature': urllib.unquote(sig) 
} 

注意,在python3 unquote位於urllib.parse

+0

感謝您的支持!我知道這是一件小事。原來我在生成簽名時進行了URL編碼,這是相當不成熟的。我需要在將來檢查我的演示代碼。我很欣賞這種見解,謝謝! –