2012-05-24 57 views
0

我在使用httplib POST時遇到了問題。這裏是代碼:在httplib中斷開POST

import base64 
import urllib 
import httplib 

http = urllib3.PoolManager() 
head = {"Authorization":"Basic %s" % base64.encodestring("foo:bar")} 
fields = {"token":"088cfe772ce0b7760186fe4762843a11"} 

conn = httplib.HTTPSConnection("foundation.iplantc.org") 
conn.set_debuglevel(2) 
conn.request('POST', '/auth-v1/renew', urllib.urlencode(fields), head) 
print conn.getresponse().read() 
conn.close() 

出來的POST是正確的。我知道我開始了一個telnet會話並輸入它工作正常。那就是:

'POST /auth-v1/renew HTTP/1.1\r\nHost: foundation.iplantc.org\r\nAccept-Encoding: identity\r\nContent-Length: 38\r\nAuthorization: Basic YXRlcnJlbDpvTnl12aesf==\n\r\n\r\ntoken=088cfe772ce0b7760186fe4762843a11' 

但是,從服務器的響應「令牌找不到」當python腳本發送。順便說一句,這與urllib3(urllib2顯示相同的錯誤)正常工作,它使用多部分編碼,但我想知道什麼是錯誤的上述。我寧願不依賴另一個第三方軟件包。

回答

2

httplib不會自動添加Content-Type標題,您必須自己添加它。 (urllib2自動添加application/x-www-form-urlencoded作爲Content-Type)。

但是,可能會丟棄服務器的是base64.encodestring引入的授權標頭之後的附加'\n'。您應該更好地使用base64.urlsafe_b64encode

+0

我確實玩過內容類型,但拼錯了它作爲內容類型... base64.urlsafe_b64encode沒有改變任何東西。 – aterrel