我在使用body解析器parse.json将jSON(作为application / json内容类型)提交到play框架操作时遇到了一个问题,其中JSON包含版权符号。
失败的JSON是:
{
"Test": "©"
}
返回的错误消息是400,Bad Request [Invalid Json]
我相信这应该可行,我检查过的所有JSON验证器都说这应该是有效的JSON。有没有办法调试/跟踪正在崩溃的游戏,或者有没有人有任何想法?我的下一步是在客户端进行HTML编码,但我认为这不应该是必需的,我担心将来会导致兼容性问题(因为这似乎也是有效的)。
我正在使用以下curl命令提交:
curl localhost:9001 / index -H“Content-Type:application / json; charset = UTF-8”-d @ failingJson.txt
注意:我重新尝试(为了可重复性)将此文件直接从网站复制到txt文件并提交相同的问题。这有可能与一些无法识别的UTF-8字符有关,但有没有办法真正找出为什么Play崩溃?
此外,在它到达我的代码之前它已经崩溃了,它在框架中的某个位置。
有什么想法吗?
编辑1:
实际上使用的是Play 2.2,而不是Play 2.1
编辑2: 这基本上就是控制器的样子:
def addItem() = Action.async(parse.json) { request =>
//Do Stuff
}
路线:
POST /index controllers.IndexController.addItem()
编辑3: 并且,为了非常清楚,这很好用:
{
"Test": "©"
}
答案 0 :(得分:0)
我认为问题在于您的failingJson.txt
文件未编码为UTF-8,这是JSON所必需的。通过将样本JSON(带有版权特征)编码为ISO-8859-1,我能够重现您的问题。除了将文件重新保存为UTF-8之外没有其他任何更改,相同的卷曲请求都很好。
基本上,您的应用可能正常运行,您只需要确保您的数据文件编码正确。
答案 1 :(得分:0)
所以,这可能是争论 - 虽然我认为@estmatic在技术上是正确的,但我认为这里有一些灰色区域。由于我们公开了一个公共API,我们希望尽可能宽容。而且,我认为Play JSON验证器太严格了。我们修复此问题的方法,可能适用于有类似问题的人,就是使用原始体解析器并在控制器级解析。
def addItem() = Action.async(parse.raw) { request =>
val s = new String(request.body.asBytes().get)
val jsBody = Json.parse(s)
val jsonResult = Json.fromJson[Entity](jsBody)
val entity = jsonResult.get
}
现在,奇怪的部分是我怀疑播放框架在内部使用完全相同的机制进行json验证,但上面的工作和处理奇怪的字符。它有点像“踢罐头”,但却是我们想要的。