繁体   English   中英

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

[英]PlayFramework returns BadRequest with content-type application/json

我在播放框架面临问题,在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。

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

如果对控制器操作使用简单的Action {...}表单,那么Play将自动尝试使用anyContent BodyParser解析正文,该使用内容类型标头来推断格式。 这意味着,如果你的内容类型为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

而提供有效的JSON正文(空对象)将成功:

curl -d "{}" -X POST -H "Content-Type: application/json" http://localhost:9000/test
< hello, world

这些其他形式的application/json “工作”的原因是因为就应用程序而言,它们只是一个随机字符串,这意味着Play默认解析为一组空的URL编码值,因此操作成功。

如果由于某种原因,您确实希望将application/json用作内容类型但希望拥有一个空体,则可以使用parse.empty体解析器。 如果你肯定有一个有效的JSON主体,最好明确它并使用parse.json

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM