2017-02-20 1 views
1

나는 REST 서비스를 쿼리하기 위해 파이썬 3과 requests 모듈/라이브러리를 사용합니다.파이썬 3 요청은 quote_plus 대신에 인용문을 사용합니다.

기본적으로 요청은 urlencoding을 위해 urllib.parse.quote_plus()을 사용합니다. 즉, 공백은 +으로 변환됩니다.

그러나 REST 서비스 I 쿼리는 and으로 잘못 해석합니다. 따라서 공백을 %20으로 인코딩해야합니다 (예 : urllib.parse.quote()).

요청을 사용하여 손쉬운 방법이 있습니까? 설명서에서 옵션을 찾을 수 없습니다.

+1

요청에 전달하기 전에 urllib.parse.quote()를 사용하여 URL 인코딩을 시도 할 수 있습니다. 이미 인코딩되므로 요청에서 더 이상 서식을 지정하지 않습니다. – 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

고맙습니다. 당신은 맞습니다,하지만 그런 식으로 request.uri (url, params = dict)에'params'라고 쓰는 멋진 요청 기능을 잃어 버렸습니다. 왜냐하면 requote_uri는 분명히 전체 URL을 필요로하기 때문입니다. 대신 Urllib을 사용하면 dict :'urllib.parse.urlencode (dict, safe = '/', quote_via = urllib.parse.quote)'를 처리 할 수 ​​있습니다. 그 맞습니까? – absurd

+1

맞습니다. 요청 라이브러리는'urllib.parse.urlencode()'와'quote_via' 매개 변수를'quote_plus'로 내부적으로 사용합니다. 나는'requests.get()'을 통해 파이프 라인을 통해 그 옵션을 전달할 수있는 방법이 있는지 알아보기 위해 파고 들었다. 나는 몇 년 전에 [이 문제 스레드] (https://github.com/kennethreitz/requests/issues/369)를 발견했는데, 이는 내가 퍼센트를 다루는 어려움으로 인해 결국 quote_plus 경로를 선택했다고 믿게했다. . (그래도 큰 도약으로 간주 될 수 있습니다) – Neelik

+2

고맙습니다. 이제 urllib로 돌아갈 생각을하고 있습니다. – absurd

관련 문제