2012-10-13 6 views
0

J'ai un problème étrange avec le serveur TCP JSON-RPC que j'ai créé dans Python-2.7. J'ai utilisé le code suivant pour créer le serveur:Python TCP Server JSON Bad Request Syntaxe

https://github.com/joshmarshall/jsonrpclib 

Je communique le client au serveur à partir du même réseau local. Dans la fenêtre de la console, je peux me connecter et exécuter des commandes sur le serveur depuis Python. Tout va bien là.

Toutefois, lorsque j'essaie d'envoyer des chaînes JSON à partir d'une application mobile (dans ce cas, un iPad), j'obtiens une erreur sur le serveur. J'ai également téléchargé cet outil dans une tentative d'envoyer les chaînes JSON: http://www.simplecomtools.com/productcart/pc/downloads/tcptesttool.zip mais avec le même résultat d'erreur. Le serveur signale une erreur "Bad request syntax". J'ai essayé plusieurs chaînes différentes - les erreurs affichées sont:

192.168.1.107 - - [13/Oct/2012 09:48:17] code 400, message Mauvaise demande de syntaxe ("{'jsonrpc': '2.0 ',' méthode ':' ajouter ',' params ': [3,6],' id ':' 8 '} ") 192.168.1.107 - - [13/Oct/2012 09:48:17]" { 'jsonrpc': '2.0', 'méthode': 'ajouter', 'params': [3,6], 'id': '8'} "400 -

192.168.1.107 - - [13/Oct/2012 09:49:44] code 400, message Syntaxe de demande incorrecte ('{"jsonrpc": "2.0", "méthode": "ajouter", "params": [3,6], "id": "8 "}") 192.168.1.107 - - [13/Oct/2012 09:49:44] "{" jsonrpc ":" 2.0 "," méthode ":" ajouter "," params ": [3,6], "id": "8"} "400 -

192.168.1.107 - - [13/Oct/2012 09:50:49] code 400, message Mauvaise demande de syntaxe ('{"jsonrpc": "2.0", "méthode": "ajouter", "params": {"x": 3, "y": 6}, "id": "8"} ') 192.168.1.107 - - [13/Oct/2012 09:50:49] "{" jsonrpc ":" 2.0 "," méthode ":" ajouter "," params ": {" x ": 3," y ": 6}," id ":" 8 "}" 400 -

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

Je ne sais vraiment pas pourquoi le serveur pense que la syntaxe de la requête est mauvaise, et je me sens un peu idiote même en posant la question. Des idées sur ce que je pourrais essayer de résoudre l'erreur de syntaxe?

Répondre

0

Dans les messages 1 et 4, votre client n'envoie pas réellement JSON; il utilise ' pour désigner les limites de chaîne, au lieu de ". Bien que les guillemets simples soient pris en charge par certaines implémentations JSON, ils sont invalid according to the standard. Corrigez l'implémentation de votre client pour envoyer des fichiers JSON réels avec des chaînes " -delimited.

Mais le problème principal est que vous n'emballez pas vos messages dans des requêtes HTTP POST, mais que vous les envoyez en mode brut. Une requête JSONRPC correcte ressemble à:

POST/HTTP/1.0 
Content-Length: 71 

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

, mais vous envoyez uniquement la dernière ligne.

En Python, vous pouvez envoyer une demande valide avec le programme exemple suivant:

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

droit, ce qui a été essayé. Comme vous pouvez le voir à partir des 4 exemples cités dans la question, les deuxième et troisième exemples utilisent tous deux des guillemets. D'autres idées? – Derrick

+0

@Derrick Désolé, je n'ai pas vu ça. Le premier et le quatrième exemple ne peuvent jamais fonctionner, donc ils ne sont en effet pas pertinents pour le problème en question. Mise à jour de la réponse avec un autre coupable probable. – phihag

+0

Ah, vous savez quoi?Votre suggestion ci-dessus m'a amené à vérifier que le client envoyait effectivement les en-têtes HTTP - ce n'était pas le cas. J'ai donc mis à jour le client pour faire ce que l'on attendait de lui (envoyer ces en-têtes) et ça fonctionne comme prévu. Merci pour votre perspicacité. – Derrick