用Python模拟cURL命令
我有一个cURL命令,它能完成我想要的功能,现在我想把它转换成Python代码。这个cURL命令是:
curl http://example.com:1234/faye -d 'message={"channel":"/test","data":"hello world"}'
这个命令是用来和一个Faye服务器通信,并向频道/test
发布消息的。这个命令可以正常工作。我想在Python中实现同样的功能,进行消息发布。我查看了这个链接和这个链接,但都没有帮到我;用这两种方法我都得到了400错误。以下是我在Python环境中尝试的一些代码:
import urllib2, json, requests
addr = 'http://example.com:1234/faye'
data = {'message': {'channel': '/test', 'data': 'hello from python'}}
data_as_json = json.dumps(data)
requests.post(addr, data=data)
requests.post(addr, params=data)
requests.post(addr, data=data_as_json)
requests.post(addr, params=data_as_json)
req = urllib2.Request(addr, data)
urllib2.urlopen(req)
req = urllib2.Request(addr, data_as_json)
urllib2.urlopen(req)
# All these things give 400 errors
不幸的是,我无法使用wireshark监控这个连接,因为它是通过SSH隧道进行的(所以所有数据都是加密的,并且在错误的端口上)。通过cURL的--trace
选项,我可以看到它没有对数据进行URL编码,所以我知道我不需要这样做。我也不想直接使用Popen
来调用cURL。
1 个回答
3
这里的message
是一个POST变量的名字,不应该包含在JSON里面。
所以,你真正想做的是这个:
data = urllib.urlencode({'message': json.dumps({'channel': '/test', 'data': 'hello from python'}))
conn = urllib2.urlopen('http://example.com:1234/faye', data=data)
print conn.read()