【问题标题】:PlayFramework returns BadRequest with content-type application/jsonPlayFramework 返回带有内容类型 application/json 的 BadRequest
【发布时间】:2014-06-06 05:12:55
【问题描述】:

我遇到了播放框架的问题,在内容类型标头中发送application/json 会返回BadRequest。 我有一个控制器 POST 方法,它需要一些标头供服务器计算正确的 hmac 值,其中一个标头是内容类型 当我将 application/json 作为 content-type 发送时,我收到了 Badrequest ,它适用于 application\/json ,但问题是我需要使用 application/json 来计算正确的 hmac 值。

我尝试过使用 Curl、Poster 和 Java 客户端,但我到处都面临同样的问题,我有一个用 Scala 编写的测试用例,它发送的应用程序/json 可以工作(但它是针对 MockController 和 FakeRequest 运行的) .

添加一些代码

这就是我添加内容类型标题httpPost.addHeader(HttpHeaders.CONTENT_TYPE, "\"application/json\""); 的方式 或者 httpPost.addHeader(HttpHeaders.CONTENT_TYPE, "application\/json"); 两者中的任何一个都可以工作,但普通的 application/json 不能

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

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

我还尝试了一个有效的 json body 和一个空的 json ,在两种情况下都得到了 BadRequest ,其中 application/json 作为内容类型标头。

【问题讨论】:

  • 请出示您的代码
  • 你的控制器函数返回了错误的请求,特别是......
  • 控制器方法是一个普通的 POST 请求,被 Action{} 包围

标签: java json scala playframework-2.0 content-type


【解决方案1】:

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

如果您对控制器操作使用普通的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

【讨论】:

  • Action(parse.json)
  • @Mikesname 我在最后的问题中添加了控制器方法代码
猜你喜欢
  • 1970-01-01
  • 2020-03-20
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2022-12-22
  • 2014-02-28
相关资源
最近更新 更多