我正在使用Python请求使用GET调用API
我使用hmac和hashlib生成一个签名,这会产生一个类似于:
的签名4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%3D
当我使用Requests并将params指定为字符串时,API调用成功,因为签名按原样使用且不会更改。
但是当我使用Requests并将params指定为字典时,上面的签名会以某种方式再次进行URL编码,导致%被编码为%25,导致签名显示如下(注意%25):< / p>
4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%253D
有关更多上下文,这里是字符串参数:
url = 'https://example.com/API'
payload = '¶meterA=valueA¶meterB=valueB¶meterC=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
会产生以下网址:
https://example.com/API&
¶meterA=valueA
¶meterB=valueB
&apikey=0e1026af-40ce-e354-f1f2-72d280ca122
&salt=12345
&signature=4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%3D
现在,字典参数:
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
会产生以下网址:
https://example.com/API
&signature=4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%253D
&salt=12345
&apikey=0e1026af-40ce-e354-f1f2-72d280ca122
¶meterA=valueA
¶meterB=valueB
再次注意签名中的%已更改为%25
谢谢!
答案 0 :(得分:1)
将字典传递给params
时,会对其进行网址编码。您的字符串已经过网址编码,因此会进行双重编码,从而导致格式错误的“签名”
您可以使用urllib.unquote
解码sig
(或者只能将'%3D'
替换为'='
)
payload = {
'parameterA': 'valueA', 'parameterB': 'valueB',
'apikey': apikey, 'salt': salt, 'signature': urllib.unquote(sig)
}
请注意,python3 unquote
位于urllib.parse
。