我正在处理一个无法理解 URL 编码参数的旧平台。
我有以下参数
params = {'fiz': 'foo:bar', 'biz': 'barfoo'}
请求生成的url
http://localhost/?fiz=foo%3Abar&biz=barfoo
旧平台所需的网址
http://localhost/?fiz=foo:bar&biz=barfoo
我尝试创建一个自定义查询字符串并将其添加到 url,但是请求将解码这个查询,并重新编码它。
improt urllib
qry = urllib.urlencode(params).replace('%3A', ':')
requests.get(url+'?'+qry) #: requests encodes the colon back to %3A
是否有任何快速解决方法看起来不像使用直接 urllib2 那样冗长?
是否可以将“安全”或“替换”列表挂钩到 API 中,这需要在请求层完成,因为需要 python 2.7。
在 Requests 中这样做有点尴尬。 在我看来,你有两个选择。 首先是自己准备Request
对象:
import requests
import urllib
url = 'http://test.com/'
qry = urllib.urlencode(params).replace('%3A', ':')
s = requests.Session()
req = requests.Request(method='GET', url=url)
prep = req.prepare()
prep.url = url + qry
r = s.send(prep)
您的另一个选择是构建一个传输适配器,在发送它们之前改变 URL,如下所示:
import requests
import urllib
class MutatingAdapter(requests.adapters.HTTPAdapter):
def send(self, request, **kwargs):
main, querystr = request.url.split('?') # Nasty hack, not always valid.
querystr = urllib.unquote(querystr)
querystr = urllib.quote(querystr, '/&:=')
request.url = '?'.join([main, querystr])
super(MutatingAdapter, self).send(request, **kwargs)
我推荐第一个选项。
你可以试试 requests.post() 和 requests.get() http://stackoverflow.com/a/26344315/1056345的json参数
最有用的评论
在 Requests 中这样做有点尴尬。 在我看来,你有两个选择。 首先是自己准备
Request
对象:您的另一个选择是构建一个传输适配器,在发送它们之前改变 URL,如下所示: