我遇到播放框架2.1.1(Java)的问题,告诉我我发送了无效的JSON。播放框架2.x和2.1.0有类似/可能相同的问题,但它应该在播放框架2.1.1 afaik中解决:见Invalid JSON in Play Framework 2.1
这就是我在代码中所做的事情,我试着把它缩短一点:
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();
}
当我跑步时:
curl -v -H "Content-Type: application/json" -X POST -d '{"email":"test@test.de","password":"test"}' http://localhost:9000/mobile/login
我收到以下回复:
< 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>
...
我已经清理了我的项目并重新运行了几次。当运行播放时,我得到以下输出:
[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
我做错了什么吗?任何帮助将不胜感激,因为这是我的第一个Play 2项目!
更新:我忘了提到我还有一个iOS客户端,它使用AFNetworking自动构建JSON,我也在那里得到一个无效的JSON响应。所以它似乎不是无效的JSON导致这个......
答案 0 :(得分:10)
您的代码没有任何问题。您是否使用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
或者,您可以使用cygwin或其他类似UNIX的命令行作为备用命令行,因为它的行为很可能是UNIX机器。
希望它对你的朋友有用。 :)
答案 1 :(得分:0)
好吧,我终于回过头来看这个,我找到了答案。对我来说问题是Play&lt; 2.1.1中有类似问题的人,我相信这是一个类似的问题,但事实并非如此。
我在play-project的lib目录中为项目添加了一个非托管依赖项。该库不是java-apns(https://github.com/notnoop/java-apns)。在内部,它使用Play框架也使用的org.codehaus.jackson类。我使用的是版本0.1.5,这是相当陈旧的。
修复,只需从lib目录中删除apns-library,将其从eclipse中的build-path中删除,然后在project / target / Build.scala中添加一个托管依赖项:
"com.notnoop.apns" % "apns" % "0.2.3"
希望这可以帮助遇到类似问题的人!
答案 2 :(得分:-1)
我在CMD中遇到了同样的问题,这解决了这个问题:
C:\Windows\System32>curl -v -u login:password -X PUT -d "{\"test\":\"aaa\",\"name\":\"Kowalski\"}" http://127.0.0.1:5984/albums/2340234802938424f7w783
P.S。在Cygwin程序中,这个问题不会发生。