【发布时间】:2012-01-21 03:20:10
【问题描述】:
我正在使用 Google Checkout API,我想将它放入 Django 应用程序中。我需要使用基本的 http 身份验证将数据发布到 Google。我一直在使用curl 进行测试,如下所示:
curl -d "$(cat mytest.xml)" -u username:password https://url
这会将我的测试 XML 文件的内容发布到 Google。而且效果很好!
但我在将那条简单的行移植到 Python 时遇到了问题。我已经管理了几种不同的方式(httplib2、urllib2、pycurl)来连接密码并发布一些东西,但响应总是 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 DATA,但是
h = httplib2.Http()
h.add_credentials(USERNAME, PASSWORD)
print = h.request(URL, "POST", body=base64.encodestring(DATA))
凭据似乎没有任何作用 - 我收到了来自 Google 的未经授权的消息。
还有更多,但它们都基于这些。
【问题讨论】:
标签: python post curl urllib2 pycurl