我在 Play Framework 时遇到问题,在内容类型 header 中发送 application/json
会返回 BadRequest
。
我有一个 Controller POST 方法,它需要一些 header 供服务器计算正确的 hmac 值,其中一个 header 是内容类型
当我发送 application/json
作为 content-type
我得到一个 Badrequest ,它适用于 application\/json
,但问题是我需要有 application/json 来计算正确的 hmac 值。
我尝试过使用 Curl、Poster 和 Java 客户端,我到处都面临同样的问题,我有一个用 Scala 编写的测试用例,它发送 application/json 是有效的(但它是针对 MockController 和 FakeRequest 运行的) .
添加一些代码
这就是我添加内容类型 header 的方式 httpPost.addHeader(HttpHeaders.CONTENT_TYPE, "\"application/json\"");
或者
httpPost.addHeader(HttpHeaders.CONTENT_TYPE, "application\/json");
两者都有效,但普通的 application/json 无效
这是我调用的 Controller 方法
def test() = Action {
implicit request =>
Ok("yippiie")
}
我还尝试了一个有效的 json 主体和一个空的 json ,在这两种情况下都得到了 BadRequest ,并将 application/json 作为内容类型 header 。
最佳答案
如果没有看到你的代码,很难确定(标题中有 Java,但用 Scala 标记了问题),但我怀疑这里的问题是你没有为 POST 请求提供有效的 JSON 正文.
如果您为 Controller 操作使用普通的 Action {...}
形式,那么 Play 将自动尝试使用 anyContent
BodyParser
解析正文,它使用内容类型 header 来推断格式。这意味着,如果您的内容类型是 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。空
正文解析器。如果您确实拥有有效的 JSON 正文,最好明确说明并使用 parse.json
。
关于java - PlayFramework 返回内容类型为 application/json 的 BadRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24074608/