2012-10-13 41 views
0

我有一個奇怪的問題,我在Python-2.7中創建的TCP JSON-RPC服務器。我使用下面的代碼來構建服務器:Python TCP服務器JSON錯誤的請求語法

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] code 400,message Bad request syntax(「{'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年9月21日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] code 400,message Bad request syntax('{「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「:」添加「,」參數「:{」x「:3,」y「:6},」id「:」8「}」400 -

192.168.1.107 - - [13/Oct/2012 17:11 :'code'400,message Bad request syntax(「{'jsonrpc':'2.0','method':'add','params':{'x':3,'y':6},'id' :'}')') 192.168.1.107 - - [13/Oct/2012 17:11:59]「{'jsonrpc':'2.0','method':'add','params':{'x': 3,'y':6},'id':8}「400 -

我真的不知道爲什麼服務器會認爲請求語法不好,即使提出問題,我也覺得有點傻。關於我可以嘗試解決語法錯誤的任何想法?

回答

0

在消息1和4中,您的客戶端實際上並未發送JSON;它使用'來表示字符串邊界,而不是"。雖然單引號由一些JSON實現支持,但它們是invalid according to the standard。糾正您的客戶端實現,以發送帶有"限定字符串的實際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()) 
+0

對,這是已經試過了。正如您從問題中引用的4個示例中可以看到的,第二個和第三個示例都使用雙引號。其他想法? – Derrick

+0

@Derrick對不起,沒有看到。第一個和第四個例子永遠無法工作,所以它們確實與眼前的問題無關。與另一個可能的罪魁禍首更新答案。 – phihag

+0

啊,你知道嗎?你上面的建議讓我確認客戶端實際上正在發送HTTP頭 - 事實並非如此。所以我更新了客戶端,實際上做了預期的事情(發送這些頭文件),並按預期工作。感謝您的洞察力。 – Derrick

相關問題