python - 使用 Python 发布原始数据

标签 python post curl urllib2 pycurl

我正在尝试使用 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 字符串。 URLUSERNAMEPASSWORD 是常量。

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/

相关文章:

java - 将语言映射到范式

Python Regex 转义运算符\in 替换和原始字符串

带有非英文字符的 PHP Curl 帖子

c# - 如何将数据发布到另一个 Web 应用程序(跨域)

rest - 如何使用cURL发送Cookies?

php - nginx 真实客户端 ip 不起作用

python - 将 int 列乘以 float 常量 pandas 数据帧

python - 使用 findall 的交流发电机中的字符串不匹配正确的字符串

javascript - 使用axios发送表单数据

php - 如何使用 wget 或curl 以类似于浏览器的方式从 CLI 执行 PHP 脚本