我在播放框架方面遇到问题,在内容类型标头中发送application/json
会返回BadRequest
。
我有一个控制器POST方法,需要一些标题供服务器计算正确的hmac值,其中一个标题是内容类型
当我发送application/json
作为content-type
我收到Badrequest时,它适用于application\/json
,但问题是我需要让application / json计算正确的hmac值。
我尝试过使用Curl,Poster和Java客户端,我到处都遇到同样的问题,我有一个用Scala编写的测试用例,它发送的application / json有效(但是这是针对MockController和FakeRequest运行的)
添加一些代码
这就是我添加内容类型标题httpPost.addHeader(HttpHeaders.CONTENT_TYPE, "\"application/json\"");
的方法
要么
httpPost.addHeader(HttpHeaders.CONTENT_TYPE, "application\/json");
两个工作中的任何一个,但普通的应用/ json没有
这是我正在调用的控制器方法
def test() = Action {
implicit request =>
Ok("yippiie")
}
此外,我尝试使用有效的json体和空的json,在两种情况下都使用application / json作为内容类型标头获得了BadRequest。
答案 0 :(得分:4)
没有看到你的代码,很难确定(你在标题中有Java,但用Scala标记了问题),但我怀疑这里的问题是你没有提供有效的JSON主体和POST请求
如果您使用普通的Action {...}
表单作为控制器操作,则Play会自动尝试使用anyContent
BodyParser
解析正文,该application/json
{{3}}使用内容类型标头来推断格式。这意味着,如果您的内容类型为def test = Action {
Ok("hello, world\n")
}
,则必须具有有效的JSON正文(没有,或者空字符串将不就足够了。)
例如,使用此操作代码:
curl -X POST -H "Content-Type: application/json" http://localhost:9000/test
< HTTP/1.1 400 Bad Request
...使用无效的JSON主体(无数据)调用它将失败:
curl -d "{}" -X POST -H "Content-Type: application/json" http://localhost:9000/test
< hello, world
而提供有效的JSON主体(空对象)将成功:
application/json
其他形式的application/json
“工作”的原因是因为就应用程序而言,它们只是一个随机字符串,这意味着Play默认解析为一组空的URL编码值,并且因此行动成功。
如果出于某种原因, 想要使用parse.empty
作为内容类型但希望拥有一个空主体,则可以使用parse.json
正文解析器。如果你肯定有一个有效的JSON主体,最好明确它并使用{{1}}。