使用Python模拟cURL命令

时间:2014-08-15 17:45:35

标签: python faye

我有一个cURL命令可以完成我需要的工作,并且我试图将其转换为python。这是cURL:

curl http://example.com:1234/faye -d 'message={"channel":"/test","data":"hello world"}'

与Faye服务器对话并向频道/test发布消息。这有效。我试图在Python中进行相同的发布。我看过thisthis,但他们都没有帮助我;我用这两种方法得到400错误。以下是我在Python shell中尝试过的一些内容:

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

不幸的是,我无法通过SSH隧道连接连接(因此所有内容都被加密并且位于错误的端口上)。使用cURL中的--trace选项,我可以看到它没有对数据进行网址编码,因此我知道我不需要这样做。我也真的不想Popen cURL本身。

1 个答案:

答案 0 :(得分: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()