首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python请求-以文本形式在params之间更改URL,而将params作为字典更改

Python请求-以文本形式在params之间更改URL,而将params作为字典更改
EN

Stack Overflow用户
提问于 2017-09-05 15:32:36
回答 1查看 557关注 0票数 1

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

我使用hmac和hashlib生成签名,其结果如下:

代码语言:javascript
复制
4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%3D

当我使用请求并将params指定为字符串时,API调用是成功的,因为签名被使用为- is而不更改。

但是,当我使用请求并将params指定为字典时,上面的签名再次被URL编码,导致%被编码为%25,导致签名显示如下(注意%25):

代码语言:javascript
复制
4epwTDKhWcIJL6bMM5f2hmBrOoXXIGD9UwX8ErfYzqU%3D

对于更多的上下文,下面是字符串params:

代码语言:javascript
复制
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为:

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

现在,字典里会出现这样的现象:

代码语言:javascript
复制
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为:

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

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-05 23:41:48

当将字典传递给params时,它会得到url编码。您的字符串已经被url编码,因此它会被双重编码,从而导致格式错误的“签名”。

您可以使用urllib.unquote解码sig (也可以用'='替换'%3D' )。

代码语言:javascript
复制
payload = { 
    'parameterA': 'valueA', 'parameterB': 'valueB', 
    'apikey': apikey, 'salt': salt, 'signature': urllib.unquote(sig) 
}

注意,在python3中,unquote位于urllib.parse中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46058683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档