Как предотвратить запросы python от процентного кодирования моих URL-адресов?

Я пытаюсь получить URL-адрес следующего формата, используя request.get() в python:

http://api.example.com/export/?format=json&key=site:dummy+type:example+group:wheel

#!/usr/local/bin/python

import requests

print(requests.__versiom__)
url = 'http://api.example.com/export/'
payload = {'format': 'json', 'key': 'site:dummy+type:example+group:wheel'}
r = requests.get(url, params=payload)
print(r.url)

Однако URL-адрес получает процентное кодирование, и я не получаю ожидаемого ответа.

2.2.1
http://api.example.com/export/?key=site%3Adummy%2Btype%3Aexample%2Bgroup%3Awheel&format=json

Это работает, если я передаю URL-адрес напрямую:

url = http://api.example.com/export/?format=json&key=site:dummy+type:example+group:wheel
r = requests.get(url)

Есть ли способ передать параметры в их исходном виде - без процентного кодирования?

Спасибо!

Ответ 1

Это нехорошее решение, но вы можете использовать string:

r = requests.get(url, params='format=json&key=site:dummy+type:example+group:wheel')

BTW:

payload = {'format': 'json', 'key': 'site:dummy+type:example+group:wheel'}

payload_str = "&".join("%s=%s" % (k,v) for k,v in payload.items())
# 'format=json&key=site:dummy+type:example+group:wheel'

r = requests.get(url, params=payload_str)

Ответ 2

В случае, если кто-то еще столкнется с этим в будущем, вы можете запросить подклассы. Сессия, переопределите метод отправки и измените необработанный URL-адрес, чтобы исправить процентные кодировки и тому подобное. Поправки к нижеследующему приветствуются.

import requests, urllib

class NoQuotedCommasSession(requests.Session):
    def send(self, *a, **kw):
        # a[0] is prepared request
        a[0].url = a[0].url.replace(urllib.quote(","), ",")
        return requests.Session.send(self, *a, **kw)

s = NoQuotedCommasSession()
s.get("http://somesite.com/an,url,with,commas,that,won't,be,encoded.")

Ответ 3

Решение, как и было предусмотрено, - это передать URL-адрес напрямую.

Ответ 4

Ответы выше не помогли мне.

Я пытался выполнить запрос get, где параметр содержал канал, но запросы на python также будут кодировать код в процентах. Так вместо этого я использовал urlopen:

# python3
from urllib.request import urlopen

base_url = 'http://www.example.com/search?'
query = 'date_range=2017-01-01|2017-03-01'
url = base_url + query

response = urlopen(url)
data = response.read()
# response data valid

print(response.url)
# output: 'http://www.example.com/search?date_range=2017-01-01|2017-03-01'