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运行的)
添加一些代码
这就是我如何添加内容类型headerhttpPost.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我在问题的末尾添加了控制器方法代码