我正在尝试使用 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 等价物用于将文本 block 发布到 HTTP Basic 身份验证服务器?我快要用尽头撞墙了。
很抱歉没有添加任何代码。这里有一些我最伟大的命中。在每一个中,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 错误 401:未经授权
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 收到一条未经授权的消息。
还有更多,但它们都是基于这些。
最佳答案
我一直对 stdlib 包有类似的困扰,直到有人指出了很棒的 requests支持基本的 Http 身份验证和其他身份验证方式,开箱即用!而且它有一个漂亮而简单的 API,这很伤人!
requests.post(url, data=DATA, headers=HEADERS_DICT, auth=(username, password))
它支持许多其他必要的功能(例如 HTTPS、摘要式身份验证等)如果您必须...请查看它...
关于python - 使用 Python 发布原始数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8519922/