我正在玩Google Checkout API,我想將它拉入Django應用程序。我需要使用基本的http認證將數據發佈到Google。我一直在curl
這樣的測試此:使用Python發佈原始數據
curl -d "$(cat mytest.xml)" -u username:password https://url
這帖子我的測試XML文件,以谷歌的內容。它工作正常!
但我有問題移植到Python的簡單的行。我已經管理了幾種不同的方式(httplib2,urllib2,pycurl),它們使用密碼連接併發布內容,但respose始終爲400 BAD REQUEST。
是否有一個python等同於將文本塊發佈到HTTP基本授權服務器?我跑出牆來撞我的頭。
道歉沒有添加任何代碼。這裏有一些我最大的點擊。在每個中,DATA
是一個XML字符串。 URL
,USERNAME
和PASSWORD
是恆定的。
req = urllib2.Request(URL)
req.add_header("Authorization", "Basic %s" % base64.encodestring('%s:%s'%(USERNAME, PASSWORD)))
u = urllib2.urlopen(req, DATA)
給了我一個可愛的HTTP Error 400: Bad Request
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, URL, USERNAME, PASSWORD)
authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler)
urllib2.install_opener(opener)
pagehandle = urllib2.urlopen(URL, DATA)
給人HTTP Error 401: Unauthorized
pycurl.global_init(pycurl.GLOBAL_DEFAULT)
c = pycurl.Curl()
c.setopt(pycurl.URL, URL)
c.setopt(pycurl.USERPWD, "%s:%s" % (USERNAME,PASSWORD))
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.HTTPHEADER, ["Content-type: text/xml"])
c.setopt(pycurl.POSTFIELDS, DATA)
b = StringIO.StringIO()
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.perform()
似乎與傳遞DATA
字符串作爲POSTFIELD奮鬥。我試過幾種不同的方式urllib.urlencode()
ING的數據,但
h = httplib2.Http()
h.add_credentials(USERNAME, PASSWORD)
print = h.request(URL, "POST", body=base64.encodestring(DATA))
憑據似乎並沒有做任何事情 - 我得到一個未經授權的消息從谷歌後面。
還有更多,但他們都基於這些。
我同意!如果我不告訴你,很難知道我試過了什麼。我很抱歉。我現在已經有了主要的方法組(對於每個「方法」我可能有大約5個排列)。用這種方法它不是授權。它看起來並不像密碼管理器做任何事情。但是我已經修復了`httplib2`(因爲已發佈),所以希望不必爲此使用其他方法。 – Oli 2011-12-15 13:05:20