2011-12-15 98 views
8

我正在玩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,USERNAMEPASSWORD是恆定的。

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)) 

憑據似乎並沒有做任何事情 - 我得到一個未經授權的消息從谷歌後面。

還有更多,但他們都基於這些。

回答

12

我一直有類似的動盪與stdlib軟件包,直到somoneone指向真棒requests,支持基本的Http身份驗證和其他身份驗證意味着直接開箱!它有一個美麗和簡單的API它傷害!

requests.post(url, data=DATA, headers=HEADERS_DICT, auth=(username, password)) 

它支持的其他必要功能的主機(例如HTTPS,摘要式身份驗證等),如果u必須請檢查出來...

2

Voidspace在上使用基本身份驗證和urllib2。我已經複製下面的相應代碼片段,改爲使用POST。

import urllib2 

theurl = 'http://www.someserver.com/toplevelurl/somepage.htm' 
username = 'johnny' 
password = 'XXXXXX' 

passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 
passman.add_password(None, theurl, username, password) 

authhandler = urllib2.HTTPBasicAuthHandler(passman) 

opener = urllib2.build_opener(authhandler) 

urllib2.install_opener(opener) 

pagehandle = urllib2.urlopen(theurl, open("mytext.xml").read()) 

沒有看到你的代碼很難說爲什麼你會得到400響應。

+0

我同意!如果我不告訴你,很難知道我試過了什麼。我很抱歉。我現在已經有了主要的方法組(對於每個「方法」我可能有大約5個排列)。用這種方法它不是授權。它看起來並不像密碼管理器做任何事情。但是我已經修復了`httplib2`(因爲已發佈),所以希望不必爲此使用其他方法。 – Oli 2011-12-15 13:05:20

2

在編輯我的帖子,包括一些源,我想我有另一個打擊(主要是因爲它是比較小的,漂亮比別人),並注意到,有在其add_credentials(..)方法並不實際的a gaping bug做任何事情。您可以解決此通過指定標題(如我urllib2做)這樣的:

resp, content = httplib2.Http().request(URL, "POST", body=DATA, headers={ 
    "Authorization": "Basic %s" % base64.encodestring('%s:%s' %(USERNAME, PASSWORD) 
}) 

而這個工作。