[英]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.