Java PlayFramework返回内容类型为application/json的BadRequest

Java PlayFramework返回内容类型为application/json的BadRequest,java,json,scala,playframework-2.0,content-type,Java,Json,Scala,Playframework 2.0,Content Type,我面临播放框架的问题,在内容类型头中发送application/json会返回BadRequest。 我有一个controllerpost方法,它需要一些头,以便服务器计算正确的hmac值,其中一个头是contenttype 当我将application/json作为内容类型发送时,我收到一个坏请求,它适用于application\/json,但问题是我需要application/json来计算正确的hmac值 我试过使用Curl、Poster和Java客户机,但我在任何地方都面临着同样的问题,

我面临播放框架的问题,在内容类型头中发送
application/json
会返回
BadRequest
。 我有一个controllerpost方法,它需要一些头,以便服务器计算正确的hmac值,其中一个头是contenttype 当我将
application/json
作为
内容类型发送时,我收到一个坏请求,它适用于
application\/json
,但问题是我需要application/json来计算正确的hmac值

我试过使用Curl、Poster和Java客户机,但我在任何地方都面临着同样的问题,我有一个用Scala编写的测试用例,它发送application/json,这是可行的(但它是针对MockController和FakeRequest运行的)

添加一些代码

这就是我如何添加内容类型header
httpPost.addHeader(HttpHeaders.content\u type,“\”application/json\”)
httpPost.addHeader(HttpHeaders.CONTENT_类型,“application\/json”)
这两种方法都可以,但普通的application/json不能

这是我正在调用的控制器方法

def test() = Action {
implicit request =>
  Ok("yippiie")
}

我还尝试了使用有效的json正文和空json,在这两种情况下都得到了BADDREQUEST,并将application/json作为内容类型头。

没有看到您的代码,很难确定(标题中有Java,但用Scala标记了问题),但我怀疑这里的问题是,您没有为POST请求提供有效的JSON主体

如果您对控制器操作使用普通的
Action{…}
表单,则Play将自动尝试使用
anyContent
解析主体,它使用content-type头推断格式。这意味着,如果您的内容类型是
application/json
,则必须具有有效的json正文(没有,否则空字符串将不够)

例如,使用此操作代码:

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
curl-xpost-H“内容类型:application/json”http://localhost:9000/test
而提供有效的JSON正文(空对象)将成功:

curl -d "{}" -X POST -H "Content-Type: application/json" http://localhost:9000/test
< hello, world
curl-d“{}”-X POST-H“内容类型:application/json”http://localhost:9000/test
<你好,世界
那些其他形式的
application/json
之所以“起作用”,是因为就应用程序而言,它们只是一个随机字符串,这意味着Play默认解析为一组空的URL编码值,因此操作成功


如果出于某种原因,您确实希望使用
application/json
作为内容类型,但希望正文为空,则可以使用
parse.empty
正文解析器。如果您确实有一个有效的JSON正文,那么最好明确说明它,并使用
parse.JSON

请显示您的代码返回错误请求的控制器函数,特别是..控制器方法是一个简单的POST请求,由动作{}即
Action(parse.JSON)包围
@Mikesname我在问题的末尾添加了控制器方法代码