【问题标题】:Python TCP Server JSON Bad Request SyntaxPython TCP 服务器 JSON 错误请求语法
【发布时间】:2012-10-13 23:26:25
【问题描述】:

我在 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','method':'add','params':{'x':3,'y': 6}, 'id':8}" 400 -

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

【问题讨论】:

    标签: python python-2.7 client json-rpc tcpserver


    【解决方案1】:

    在消息 1 和 4 中,您的客户端实际上并未发送 JSON;它使用' 来表示字符串边界,而不是"。虽然一些 JSON 实现支持单引号,但它们是 invalid according to the standard。更正您的客户端实现以发送带有"-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())
    

    【讨论】:

    • 对,已经试过了。从问题中引用的 4 个示例中可以看出,第二个和第三个示例都使用了双引号。其他想法?
    • @Derrick 抱歉,没看到。第一个和第四个示例永远不会起作用,因此它们确实与手头的问题无关。用另一个可能的罪魁祸首更新了答案。
    • 啊,你知道吗?您上面的建议使我验证客户端实际上是在发送 HTTP 标头 - 它不是。因此,我更新了客户端以实际执行预期的操作(发送这些标头)并且它按预期工作。感谢您的洞察力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 2015-07-24
    相关资源
    最近更新 更多