带请求客户端的txjsonrpc服务器

时间:2015-08-30 14:43:37

标签: python twisted

尝试通过shell=True请求与txjsonrpc服务器联系。

服务器

requests.post()

客户端

from txjsonrpc.web import jsonrpc
from twisted.web import server
from twisted.internet import reactor


class JsonRpc(jsonrpc.JSONRPC):
    def jsonrpc_status(self):
        return {"status": "200"}

reactor.listenTCP(interface="127.0.0.1", port=7081, factory=server.Site(JsonRpc()))
reactor.run()

这很有效。

python库curl -X POST http://127.0.0.1:7081 -d '{"params": [], "method": "status"}' >>> '{"status": 200}' 没有:

客户#2

requests

服务器发出错误:

import requests

req = requests.post(
    url="http://127.0.0.1:7081",
    data={
        "params": [],
        "method": "status"
    })

print req.status_code
>>> 500

客户端#2示例中 File "/usr/lib/python2.7/json/__init__.py", line 338, in loads return _default_decoder.decode(s) File "/usr/lib/python2.7/json/decoder.py", line 366, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode raise ValueError("No JSON object could be decoded") exceptions.ValueError: No JSON object could be decoded 的参数是正确的。但是,如果我查看ngrep输出,我可以看到requests.post(data)被丢弃。

CSI:的ngrep

params

如您所见,只传输method = status。 bla@bla:$ sudo ngrep -qt -W byline port 7081 interface: eth0 (192.168.1.0/255.255.255.0) filter: (ip or ip6) and ( port 7081 ) T 2015/08/30 16:03:18.202439 192.168.1.30:41272 -> 192.168.1.61:7081 [AP] POST / HTTP/1.1. Host: 192.168.1.61:7081. Content-Length: 13. Content-Type: application/x-www-form-urlencoded. Accept-Encoding: gzip, deflate, compress. Accept: */*. User-Agent: Mozilla 4.3. . method=status 决定我的requests参数不值得发送,因为它是空的。这会在txjsonrpc服务器上创建一个例外。

如何通过params客户端请求与txjsonrpc服务器联系?

也;我不介意切换到另一个与Twisted兼容的jsonrpc服务器库,如果这样可以让我的生活更轻松。

1 个答案:

答案 0 :(得分:2)

另请注意,您super.onCreate()发送的POST不是requests发送的JSON,而是发送x-www-form-urlencoded键/值对。尝试在curl -d来电中使用data=替换json=,如this example所示。