python请求:不带编码的URL
我知道请求库在内部编码URL类似于urllib.parse.quote()。早些时候,这在请求中使用config={'encode_uri':False}进行配置,但此配置已停止 我需要把一个AWS S3预签名的URL,其中包含一个签名。当我将requests.put()用于接收到的URL时,我得到了带有SignatureDesNotMatch的403响应 提供给requests.put()的URL的签名部分是 Bf%2BBufRIxITziSJGuAq9cYFbxBM%3D 服务器将其视为: Bf+BufRIxITziSJGuAq9cYFbxBM=python请求:不带编码的URL,python,amazon-s3,python-requests,pre-signed-url,Python,Amazon S3,Python Requests,Pre Signed Url,我知道请求库在内部编码URL类似于urllib.parse.quote()。早些时候,这在请求中使用config={'encode_uri':False}进行配置,但此配置已停止 我需要把一个AWS S3预签名的URL,其中包含一个签名。当我将requests.put()用于接收到的URL时,我得到了带有SignatureDesNotMatch的403响应 提供给requests.put()的URL的签名部分是 Bf%2BBufRIxITziSJGuAq9cYFbxBM%3D 服务器将其视为:
这是否与对URL进行编码的请求库以及可能如上所述转换签名部分有关?如果是这样,是否有任何方法阻止它并让它使用传递的URL?覆盖编码函数
import requests, urllib
class NoQuotedCommasSession(requests.Session):
def send(self, *a, **kw):
# a[0] is prepared request
a[0].url = a[0].url.replace(urllib.quote(","), ",")
return requests.Session.send(self, *a, **kw)
s = NoQuotedCommasSession()
s.get("http://somesite.com/an,url,with,commas,that,won't,be,encoded.")
我们可能应该后退一点,了解你到底想做什么。S3API仅支持使用预签名URL的
GET
、HEAD
、PUT
和DELETE
请求。。。不POST
。我想不出有什么例外,但我可能弄错了POST
(基于浏览器的对象上载)请求使用web表单传递策略、签名和其他值,而不是预先签名的URL。此外,您的签名看起来是正确的,并且没有明显的理由希望避免这种情况。在SigV2签名中,+
/
=
被正确地转义为%2B
%2F
%3E
。你说得对,Michael,它本不应该发布,我已经更新了。关于签名,AWS似乎不需要转义字符hanks,在我的例子中,我必须使用[0].url.replace(urllib.parse.unquote(“%2B”),“%2B”)