使用CURL的JSON响应无效

mac*_*nes 4 curl playframework-2.0

我有一个播放框架2.1.1(Java)的问题告诉我,我发送无效的JSON.播放框架2.x和2.1.0有类似/可能相同的问题,但它应该在播放框架2.1.1 afaik中解决:请参阅Play Framework 2.1中的无效JSON

这就是我在代码中所做的,我试着让它变得更短:

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();
}
Run Code Online (Sandbox Code Playgroud)

当我跑:

curl -v -H "Content-Type: application/json" -X POST -d '{"email":"test@test.de","password":"test"}' http://localhost:9000/mobile/login
Run Code Online (Sandbox Code Playgroud)

我收到以下回复:

< 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>
...
Run Code Online (Sandbox Code Playgroud)

我清理了我的项目并重新运行了好几次.在运行游戏时,我得到以下输出:

[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
Run Code Online (Sandbox Code Playgroud)

我做错了什么吗?任何帮助将不胜感激,因为这是我的第一个Play 2项目!

更新:我忘了提到我还有一个iOS客户端,它使用AFNetworking自动构建JSON,我在那里也得到一个无效的JSON响应.所以它似乎不是无效的JSON导致这个......

Way*_*oga 11

你的代码没有错.你使用Windows命令行(CMD.exe)运行curl?如果您使用的CMD.exe运行curl,必须修复要传递的JSON格式的数据.我认为在Windows中,使用引用与UNIX机器有点不同.

最简单的解决方法是避免使用单引号和使用双引号来开始和结束JSON数据,与双引号的JSON数据逃脱(由\字符),可能会有点累,但它应该工作:

curl -v -H "Content-Type: application/json" -X POST -d "{\"email\":\"test@test.de\",\"password\":\"test\"}" http://localhost:9000/mobile/login
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用cygwin其他类似UNIX的命令行作为替代命令行,因为它的行为很可能是UNIX机器.

希望它对你的朋友有用.:)


mac*_*nes 0

好吧,我终于回过头来研究这个问题并找到了答案。对我来说,问题是 Play <2.1.1 中有人遇到类似的问题,我相信这是一个类似的问题,但事实并非如此。

我在我的播放项目的 lib 目录中添加了对项目的非托管依赖项。该库是 notnoop java-apns ( https://github.com/notnoop/java-apns )。在内部,它使用 Play 框架也使用的 org.codehaus.jackson-classes。我使用的是0.1.5版本,这个版本相当旧了。

修复方法是,只需从 lib 目录中删除 apns-library,将其从 eclipse 中的构建路径中删除,然后在 project/target/Build.scala 中添加托管依赖项:

"com.notnoop.apns" % "apns" % "0.2.3"
Run Code Online (Sandbox Code Playgroud)

希望这对遇到类似问题的人有所帮助!