使用Python发布原始数据

Oli*_*Oli 9 python post curl urllib2 pycurl

我正在使用Google Checkout API,我想将它拉入Django应用程序.我需要使用基本的http身份验证将数据发布到Google.我一直用curl这样测试:

curl -d "$(cat mytest.xml)" -u username:password https://url
Run Code Online (Sandbox Code Playgroud)

并将我的测试XML文件的内容发布到Google.它工作正常!

但是我在将这个简单的行移植到Python时遇到了问题.我已经管理了几种不同的方式(httplib2,urllib2,pycurl)连接密码并发布一些东西但是respose总是400 BAD REQUEST.

是否有一个python等效的发布文本块到HTTP Basic auth服务器?我跑出墙壁撞到我的脑袋.


抱歉不添加任何代码.以下是我最热门的一些热门话题.在每个中,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)
Run Code Online (Sandbox Code Playgroud)

给了我一个可爱的 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)
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

似乎很难将DATA字符串作为POSTFIELD传递.我urllib.urlencode()以几种不同的方式尝试过DATA,但是


h = httplib2.Http()
h.add_credentials(USERNAME, PASSWORD)
print = h.request(URL, "POST", body=base64.encodestring(DATA))
Run Code Online (Sandbox Code Playgroud)

凭证似乎没有做任何事情 - 我从Google收到了未经授权的消息.

还有更多,但它们都基于这些.

nem*_*ixx 12

我一直在使用stdlib包进行类似的混乱,直到somoneone指向支持基本Http身份验证和其他身份验证的令人敬畏的请求,直接开箱即用!它有一个美丽而简单的API,它很痛!

requests.post(url, data=DATA, headers=HEADERS_DICT, auth=(username, password))
Run Code Online (Sandbox Code Playgroud)

它支持许多其他必要的功能(例如HTTPS,摘要式身份验证等)请检查它是否必须...