2014-07-24 4 views
0

가이 코드와 POST 쿼리를 보내려고 전달되지 :POST 요청은

def open(self, url, params): 
    self.__opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar())) 
    c = self.__opener.open(
     urllib2.Request(
      url, 
      urllib.urlencode(params), 
      {"User-agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"} 
     ) 
    ) 

Class.open('http://example.com', {'username': 'test'}); 

그러나 서버가 사용자 이름 필드가 비어 나에게 말한다.

urllib.Request('http://example.com?username=test'); 

완벽하게 작동합니다. 그것을 고치는 방법?

+0

를 파이썬 3에는'urllib2'이 없다, 그것은 그것의 모듈과 단지 꾸러미 'Request'라는 클래스를 가진 모듈이 아닙니다. 먼저, 실제로 어떤 버전을 사용하고 있는지 알려주십시오. – abarnert

+0

@abarnert, 죄송합니다. 파이썬 2.7.5에서 해석하려고했습니다. – qwerty

+0

OK, 다음 문제. 첫 번째 버전에서는 본문으로'username = test' (www-form-encoded)를 전달합니다. 두 번째 버전에서는 (실제로'urllib.Request'를 사용했다고 가정합니다. 왜냐하면'urllib.Request'와 같은 것이 없기 때문입니다), 당신은 그것을 쿼리 문자열에 전달할 것입니다. _ 많은 웹 서비스가이 두 가지를 동일한 것으로 취급하지만, 그렇게 할 필요는 없습니다. – abarnert

답변

2

요청 본문에 데이터를 보내고 있습니다.; 이것은 POST 요청에서 완벽하게 정상입니다. 그러나 http://example.com?username=test은 POST 요청이 아닙니다. 그것은 대신 GET입니다.

urlencode()과 동일하게 적용 할 수 있습니다. 단지 ?으로 URL에 추가하십시오`urllib`이 있지만, 이것은 파이썬 3하지

c = self.__opener.open(
    urllib2.Request(
     url + '?' + urllib.urlencode(params), 
     {"User-agent": "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"} 
    ) 
) 
+0

문자열 조작 대신에'urlparse.urlunparse' 또는 유사하게 더 높은 수준의 함수를 사용할 수도 있습니다. 예를 들어, 이미 쿼리 문자열이있는 URL이 있다면 작동 할 것입니다. – abarnert

+0

너무 이상합니다. 양식 작업 매개 변수는 게시입니다. 제발,이 레포를 참조하십시오 : https://github.com/Ejz/Common/blob/master/carnage-bot/bot.py (urlopen 메서드) 나는 그것이 작동하지만, 왜 내 코드가 작동하지 않는 것 같아? – qwerty

+0

@qwerty : 서버에 따라 다릅니다. 서버가 GET 요청을 받아들이지 만 POST를 거부하면 GET을 계속합니다. –

관련 문제