2013-05-11 3 views
3

J'ai un problème avec le framework de jeu 2.1.1 (Java) qui me signale que j'envoie JSON invalide. Il y a eu un problème similaire/éventuel pour les frameworks de jeu 2.x et 2.1.0, mais il était supposé être résolu dans le framework de jeu 2.1.1 afaik: Voir Invalid JSON in Play Framework 2.1Réponse JSON non valide en utilisant CURL

C'est ce que je fais dans le code, je l'ai essayé de faire un peu plus court:

import org.codehaus.jackson.JsonFactory; 
import org.codehaus.jackson.JsonNode; 
import org.codehaus.jackson.JsonParser; 
import play.libs.Json; 
import play.mvc.BodyParser; 

@BodyParser.Of(BodyParser.Json.class) 
public static Result login() { 
    JsonNode json = request().body().asJson(); 
} 

Quand je lance:

curl -v -H "Content-Type: application/json" -X POST -d '{"email":"[email protected]","password":"test"}' http://localhost:9000/mobile/login 

Je reçois la réponse suivante:

< HTTP/1.1 400 Bad Request 
< Content-Type: text/html; charset=utf-8 
< Content-Length: 1917 
... 
<p id="detail"> 
    For request 'POST /mobile/login' [Invalid Json] 
</p> 
... 

J'ai nettoyé mon projet et l'ai réexécuté plusieurs fois. Lors de l'exécution pièce sur je reçois la sortie suivante:

[info] Loading project definition from /path/to/project 
[info] Set current project to FFPushAlarmPlay (in build file:/path/to) 
[info] This is sbt 0.12.2 
[info] The current project is {file:/path/to}... 
[info] The current project is built against Scala 2.10.0 
[info] Available Plugins: play.Project, sbt.PlayProject, com.typesafe.sbteclipse.plugin.EclipsePlugin, com.typesafe.sbtidea.SbtIdeaPlugin 
[info] sbt, sbt plugins, and build definitions are using Scala 2.9.2 

que je fais quelque chose de terriblement mal? Toute aide serait grandement appréciée car c'est mon premier projet Play 2!

Mise à jour: J'ai oublié de mentionner que j'ai aussi un client iOS qui construit automatiquement le JSON en utilisant AFNetworking et j'obtiens également une réponse JSON invalide. Donc, il ne semble pas être invalide JSON causant cela ...

Répondre

0

Très bien, j'ai finalement pu me pencher là-dessus et j'ai trouvé la réponse. Le problème pour moi était qu'il y avait des gens avec des problèmes similaires dans Play < 2.1.1 et ma conviction était que c'était un problème similaire, ce qui n'était pas le cas.

J'ai ajouté une dépendance non gérée au projet dans le répertoire lib de mon projet de lecture. La bibliothèque était notnoop java-apns (https://github.com/notnoop/java-apns). En interne, il utilise les classes org.codehaus.jackson que le framework Play utilise également. J'ai utilisé la version 0.1.5 qui est assez ancienne. Le correctif, supprimez simplement la bibliothèque apns du répertoire lib, supprimez-le du chemin de compilation dans eclipse puis dans projet/target/Build.scala ajouter une dépendance gérée:

"com.notnoop.apns" % "apns" % "0.2.3" 

Espérons que cela aide ceux qui rencontrent des problèmes similaires!

8

Il n'y a rien de mal dans votre code. Utilisez-vous la ligne de commande Windows (CMD.exe) pour exécuter curl? Si vous utilisez CMD.exe pour exécuter curl, vous devez corriger les données au format JSON que vous souhaitez transmettre. Je pense que dans Windows, l'utilisation de quote est un peu différente de la machine UNIX.

La solution la plus simple est de éviter d'utiliser les guillemets simples et utiliser des guillemets pour commencer et à la fin des données JSON, avec les guillemets doubles dans les données JSON se sont échappés (par \ caractère), peut être peu fatiguant mais il devrait œuvres:

curl -v -H "Content-Type: application/json" -X POST -d "{\"email\":\"[email protected]\",\"password\":\"test\"}" http://localhost:9000/mobile/login 

ou, vous pouvez utiliser cygwin ou autres UNIX-comme-ligne de commande pour windows comme ligne de commande alternative, car son comportement probable que la machine UNIX.

J'espère que cela vous sera utile. :)

+0

Merci pour la réponse! J'utilise OS X. J'ai juste essayé votre suggestion sur échapper le JSON, mais toujours obtenir "Invalid JSON" comme réponse. Cela m'aurait surpris car j'ai un client iOS qui reçoit la même réponse et utilise la librairie AFNetworking pour la requête JSON. J'ai oublié de le mentionner dans mon message original, désolé! – mactunes

+0

Vous pouvez également installer Git qui inclut la commande Git Bash avec curl. – null

-1

J'ai eu le même problème dans le CMD et ce a résolu le problème:

C:\Windows\System32>curl -v -u login:password -X PUT -d "{\"test\":\"aaa\",\"name\":\"Kowalski\"}" http://127.0.0.1:5984/albums/2340234802938424f7w783 

post-scriptum Dans le programme Cygwin ce problème ne se produit pas.