<p>запросы принудительно переопределяют кодировку строки запроса</p>

Созданный на 11 июл. 2013  ·  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.

Самый полезный комментарий

Это немного неудобно делать в запросах. На мой взгляд, у вас есть два варианта. Первый - самостоятельно подготовить объекты 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 Комментарий

Это немного неудобно делать в запросах. На мой взгляд, у вас есть два варианта. Первый - самостоятельно подготовить объекты 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)

Рекомендую первый вариант.

вы можете попробовать параметр json для requests.post () и requests.get () http://stackoverflow.com/a/26344315/1056345

Была ли эта страница полезной?
0 / 5 - 0 рейтинги