我有一个cURL命令可以完成我需要的工作,并且我试图将其转换为python。这是cURL:
curl http://example.com:1234/faye -d 'message={"channel":"/test","data":"hello world"}'
与Faye服务器对话并向频道/test
发布消息。这有效。我试图在Python中进行相同的发布。我看过this和this,但他们都没有帮助我;我用这两种方法得到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本身。
答案 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()