Я имею дело с устаревшей платформой, которая не понимает параметры, закодированные в 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)
Рекомендую первый вариант.
вы можете попробовать параметр json для requests.post () и requests.get () http://stackoverflow.com/a/26344315/1056345
Самый полезный комментарий
Это немного неудобно делать в запросах. На мой взгляд, у вас есть два варианта. Первый - самостоятельно подготовить объекты
Request
:Другой вариант - создать транспортный адаптер, который изменяет URL-адреса перед их отправкой, например: