<p>请求强制覆盖查询字符串编码</p>

创建于 2013-07-11  ·  3评论  ·  资料来源: psf/requests

我正在处理一个无法理解 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)

所有3条评论

在 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参数

此页面是否有帮助?
0 / 5 - 0 等级