我使用Python请求使用GET调用API
我使用hmac和hashlib生成签名,其结果如下:
4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%3D当我使用请求并将params指定为字符串时,API调用是成功的,因为签名被使用为- is而不更改。
但是,当我使用请求并将params指定为字典时,上面的签名再次被URL编码,导致%被编码为%25,导致签名显示如下(注意%25):
4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%3D对于更多的上下文,下面是字符串params:
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结果的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结果的URL为:
https://example.com/API
&signature=4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%253D
&salt=12345
&apikey=0e1026af-40ce-e354-f1f2-72d280ca122
¶meterA=valueA
¶meterB=valueB再次注意,签名中的%已更改为%25
谢谢!
发布于 2017-09-05 23:41:48
当将字典传递给params时,它会得到url编码。您的字符串已经被url编码,因此它会被双重编码,从而导致格式错误的“签名”。
您可以使用urllib.unquote解码sig (也可以用'='替换'%3D' )。
payload = {
'parameterA': 'valueA', 'parameterB': 'valueB',
'apikey': apikey, 'salt': salt, 'signature': urllib.unquote(sig)
}注意,在python3中,unquote位于urllib.parse中。
https://stackoverflow.com/questions/46058683
复制相似问题