0

我在 Python-2.7 中创建的 TCP JSON-RPC 服务器有一个奇怪的问题。我使用以下代码构建服务器:

https://github.com/joshmarshall/jsonrpclib

我正在从同一本地网络中将客户端与服务器通信。在控制台窗口中,我可以从 Python 中连接到服务器并针对服务器运行命令。一切都很好。

但是,当我尝试从移动应用程序(在本例中为 iPad)发送 JSON 字符串时,服务器上出现错误。我还下载了此工具以尝试发送 JSON 字符串:http ://www.simplecomtools.com/productcart/pc/downloads/tcptesttool.zip但具有相同的错误结果。服务器正在报告“错误的请求语法”错误。我尝试了几个不同的字符串 - 显示的错误是:

192.168.1.107 - - [13/Oct/2012 09:48:17] 代码 400,消息错误请求语法(“{'jsonrpc':'2.0','method':'add','params':[3, 6],'id':'8'}") 192.168.1.107 - - [13/Oct/2012 09:48:17] "{'jsonrpc':'2.0','method':'add','params ':[3,6],'id':'8'}" 400 -

192.168.1.107 - - [13/Oct/2012 09:49:44] 代码 400,消息错误请求语法 ('{"jsonrpc":"2.0","method":"add","params":[3, 6],"id":"8"}') 192.168.1.107 - - [13/Oct/2012 09:49:44] "{"jsonrpc":"2.0","method":"add","params ":[3,6],"id":"8"}" 400 -

192.168.1.107 - - [13/Oct/2012 09:50:49] 代码 400,消息错误请求语法 ('{"jsonrpc":"2.0","method":"add","params":{"x ":3,"y":6},"id":"8"}') 192.168.1.107 - - [13/Oct/2012 09:50:49] "{"jsonrpc":"2.0","method ":"add","params":{"x":3,"y":6},"id":"8"}" 400 -

192.168.1.107 - - [13/Oct/2012 17:11:59] 代码 400,消息错误请求语法(“{'jsonrpc':'2.0','method':'add','params':{'x ':3,'y':6}, 'id':8}") 192.168.1.107 - - [13/Oct/2012 17:11:59] "{'jsonrpc':'2.0', '方法': 'add', 'params':{'x':3,'y':6}, 'id':8}" 400 -

我真的不知道为什么服务器会认为请求语法不好,即使问这个问题我也觉得有点傻。关于我可以尝试解决语法错误的任何想法?

4

1 回答 1

0

在消息 1 和 4 中,您的客户端实际上并未发送 JSON;它'用于表示字符串边界,而不是". 虽然一些 JSON 实现支持单引号,但根据标准它们是无效的。更正您的客户端实现以发送带有"-delimited 字符串的实际 JSON。

但主要问题是您没有将消息包装到 HTTP POST 请求中,而是将它们原始发送。正确的 JSONRPC 请求如下所示:

POST / HTTP/1.0
Content-Length: 71

{"jsonrpc": "2.0", "params": [3, 6], "id": "er5qtdbz", "method": "pow"}

,但您只发送最后一行。

在 Python 中,您可以使用以下示例程序发送有效请求:

import json
try:
    from urllib.request import urlopen
except ImportError: # Python<3
    from urllib2 import urlopen

req = {"jsonrpc":"2.0","method":"add","params":[3,6],"id":0}
req_data = json.dumps(req).encode('utf-8')
u = urlopen('http://localhost:8080/', req_data)
print(u.read())
于 2012-10-14T20:21:58.873 回答