2014-07-24 208 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

這不是Python 3的沒有'urllib2'在Python 3。而且,雖然有一個'urllib',它只是一個與它的模塊封裝,而不是一個名爲'Request'的類。所以,首先告訴我們你使用的是哪個版本。 – abarnert

+0

@abarnert,對不起。我試圖在Python 2.7.5中解釋它。 – qwerty

+0

好的,下一個問題。在第一個版本中,您傳遞了'username = test'(www-form-encoded)作爲正文。在第二個版本中(我假設你真的在那裏使用'urllib2.Request',因爲沒有'urllib.Request'這樣的東西?),你將它傳遞給查詢字符串。雖然_many_ web服務會將這兩者視爲同一件事,但並不要求他們這樣做。 – abarnert

回答

2

您正在發送的數據爲請求主體;這在POST請求中是完全正常的。但是,http://example.com?username=test不是POST請求;這是一個GET。

您可以使用urlencode();只是它?添加到URL:

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。 –