URLエンコードされたパラメータを理解しないレガシープラットフォームを扱っています。
私は次のパラメータを持っています
params = {'fiz': 'foo:bar', 'biz': 'barfoo'}
リクエストによって生成されたURL
http://localhost/?fiz=foo%3Abar&biz=barfoo
レガシープラットフォームに必要なURL
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が必要なため、リクエストレイヤーで実行する必要があります。
これは、リクエストで行うのは少し厄介です。 私が見ているように、2つの選択肢があります。 1つ目は、 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)
もう1つのオプションは、次のように、URLを送信する前に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()のjsonパラメーターを試すことができますhttp://stackoverflow.com/a/26344315/1056345
最も参考になるコメント
これは、リクエストで行うのは少し厄介です。 私が見ているように、2つの選択肢があります。 1つ目は、
Request
オブジェクトを自分で準備することです。もう1つのオプションは、次のように、URLを送信する前にURLを変更するトランスポートアダプターを作成することです。