2017-02-20 35 views
1

Я использую Python 3 и модуль/библиотеку requests для запроса службы REST.python3 просит использовать цитату вместо quote_plus

Похоже, что запросы по умолчанию используют urllib.parse.quote_plus() для urlencoding, то есть пробелы преобразуются в +.

Однако служба REST, которую я запрашиваю, неверно интерпретирует это как and. Поэтому мне нужно кодировать пробелы как %20, т. Е. Вместо этого использовать urllib.parse.quote().

Есть ли простой способ сделать это с помощью запросов? Я не мог найти никакой опции в документации.

+1

Вы можете попробовать кодировать URL-адрес, используя 'urllib.parse.quote()' перед передачей его в запросы. Поскольку он уже будет закодирован, запросы больше не будут пытаться форматировать. – Neelik

+0

Спасибо, это работает. Однако могу ли я сделать это только с запросами/urllib3 и не загружать другой модуль (urllib)? – absurd

ответ

3

Оказывается, вы можете!

from requests.utils import requote_uri 
url = "https://www.somerandom.com/?name=Something Cool" 
requote_uri(url) 

'https://www.somerandom.com/?name=Something%20Cool' 

documentation here Метод requote_uri находится примерно на полпути вниз страницы.

+0

Спасибо. Вы правы, но таким образом я теряю приятную функцию запроса добавления простого dict как 'params' к запросам.get (url, params = dict), поскольку requote_uri, очевидно, нуждается в полном URL-адресе. Вместо этого вместо Urllib вы можете обращаться с dict: 'urllib.parse.urlencode (dict, safe = '/', quote_via = urllib.parse.quote)'. Это верно? – absurd

+1

Это правильно. Библиотека запросов внутренне использует 'urllib.parse.urlencode()' с параметром 'quote_via', установленным в' quote_plus'. Я копался, чтобы посмотреть, есть ли способ передать эту опцию через конвейер через 'request.get()', и кажется, что это невозможно. Я нашел [эту проблему] (https://github.com/kennethreitz/requests/issues/369) несколько лет назад, что заставляет меня поверить, из-за их трудностей, связанных с процентами, в конечном итоге они выбрали маршрут quote_plus , (Это можно считать огромным скачком, хотя) – Neelik

+2

Спасибо. Ну, тогда я теперь собираюсь вернуться к urllib вместо этого. – absurd