2012-09-21 2 views
6

파이썬 스크립트에서 자동화를 시도하고 있는데 문제가 발생했습니다. 서버에 POST를 수행하려고합니다.Python의 POST 요청에서 '+'문자 전달

url = 'http://www.example.com' 
params = {'arg0': 'value', 'arg1': '+value'} 

f = urllib.urlopen(url, urllib.urlencode(params)) 
print f.read() 

나는, 즉

Line-based text data: application/x-www-form-urlencoded 
arg0=value&arg1=%2Bvalue 
내가 파이썬 함께 할 때 그러나 +%2B로 변경됩니다 두 번째 인수가 arg1+value로 전달되는 해당 브라우저 동작의 Wireshark를 캡처했을

그것은해야 할 때 :

Line-based text data: application/x-www-form-urlencoded 
arg0=value&arg1=+value 

나는 또한 요청 모듈을 사용하고이 보인다 똑같은 일을해야합니다. 모든 사람이 너무 많은위한 캐치 것 같다 당신이 '+'와 관련된 문제가있을 때

url = 'http://www.example.com' 
params = {'arg0': 'value', 'arg1': '+value'} 

f = requests.post(url, params) 

구글은 당신의 친구가 아닙니다.

+0

어떤 버전의 요청을 사용하고 있습니까? – root

+0

오늘 요청을 설치했습니다. - 0.14.0 –

+5

"+ '와 관련된 문제가있을 때 Google이 귀하의 친구가 아닙니다. - 특수 문자를 검색 할 때 http://symbolhound.com/과 같은 특수 검색 엔진이 있습니다. – l4mpi

답변

7

+ 문자는 GET 또는 POST 데이터를 인용 할 때 공백을 적절하게 인코딩합니다. 따라서 리터럴 + 문자도 이스케이프해야하므로 다른 쪽 끝에있는 공간으로 디코딩되지 않도록해야합니다.

제어 이름과 값은 이스케이프 : RFC 2396, section 2.2, section 3.4HTML specification, application/x-www-form-urlencoded section를 참조하십시오. 공백 문자는`+ '로 바뀌고 예약 문자는 [RFC1738], 2.2 절에서 설명한대로 이스케이프 처리됩니다. 당신이 공간에 + 문자를 해독하지 않는 응용 프로그램에 데이터를 게시하는 대신 대신 같은 문자 등의 데이터 더하기 기호를 처리하는 경우

, 당신은 것을 지정하는 대신 urllib.quote function를 사용하여 매개 변수를 직접 인코딩해야 + 문자 인코딩되는 것은 아니다 :

import urllib 
def urlencode_withoutplus(query): 
    if hasattr(query, 'items'): 
     query = query.items() 
    l = [] 
    for k, v in query: 
     k = urllib.quote(str(k), safe=' /+') 
     v = urllib.quote(str(v), safe=' /+') 
     l.append(k + '=' + v) 
    return '&'.join(l) 

데모 :

>>> urlencode_withoutplus({'arg0': 'value', 'arg1': '+value'}) 
'arg0=value&arg1=+value' 

를 사용는 단순히 data 값으로 위의 함수의 결과를 전달할 수 있지만,이 경우 수동으로 콘텐츠 형식 설정해야합니다

requests.post(url, urlencode_withoutplus(query), 
    headers={'Content-Type': 'application/x-www-form-urlencoded'}) 
+0

그건 내가 원했던 반대 방향으로가는 것처럼 보입니다. 내가 urllib.urlencode를하기 전에 urllib.quote (params [ 'arg1'])를 수행해야한다고 말하는가? wireshark에서 캡처 할 때 '% 252Bvalue'만 생성하기 때문이다. –

+0

@DouglasKastle : 아니요, urllib.urlencode 대신 *를 사용합니다. –

+0

죄송합니다. 대답을 마치기 전에 봤습니다. –

4
urllib2.quote(' ')  # '%20' 
urllib2.unquote('%20') # ' ' 

가 왜 그냥 매개 변수 부분을 인용을 끝내하지 :

f = urllib.urlopen(url, urllib.unquote(urllib.urlencode(params))) 
+0

재미있을 것입니다.이 경우에는 충분할 것입니다. 보호해야 할 일부 매개 변수가 있다고 상상합니다. –

관련 문제