用Python模拟cURL命令

2 投票
1 回答
780 浏览
提问于 2025-04-18 17:26

我有一个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()

撰写回答