PlayFramework使用content-type application / json返回BadRequest

时间:2014-06-06 05:12:55

标签: java json scala playframework-2.0 content-type

我在播放框架方面遇到问题,在内容类型标头中发送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。

1 个答案:

答案 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}}。