Python请求 - URL作为文本与params之间的URL更改为字典

时间:2017-09-05 15:32:37

标签: python-2.7 python-requests

我正在使用Python请求使用GET调用API

我使用hmac和hashlib生成一个签名,这会产生一个类似于:

的签名
4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%3D

当我使用Requests并将params指定为字符串时,API调用成功,因为签名按原样使用且不会更改。

但是当我使用Requests并将params指定为字典时,上面的签名会以某种方式再次进行URL编码,导致%被编码为%25,导致签名显示如下(注意%25):< / p>

4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%253D

有关更多上下文,这里是字符串参数:

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

会产生以下网址:

https://example.com/API&
&parameterA=valueA
&parameterB=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
&parameterA=valueA
&parameterB=valueB

再次注意签名中的%已更改为%25

谢谢!

1 个答案:

答案 0 :(得分:1)

将字典传递给params时,会对其进行网址编码。您的字符串已经过网址编码,因此会进行双重编码,从而导致格式错误的“签名” 您可以使用urllib.unquote解码sig(或者只能将'%3D'替换为'='

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

请注意,python3 unquote位于urllib.parse