<p>リクエストはクエリ文字列エンコーディングを強制的にオーバーライドします</p>

作成日 2013年07月11日  ·  3コメント  ·  ソース: psf/requests

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)

全てのコメント3件

これは、リクエストで行うのは少し厄介です。 私が見ているように、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

このページは役に立ちましたか?
0 / 5 - 0 評価