java - PlayFramework 返回内容类型为 application/json 的 BadRequest

标签 java json scala playframework-2.0 content-type

我在 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/

相关文章:

scala - 在scala中我们如何找到每个客户的最新记录?

java - 如何减少 Scala (/Java) 的启动开销?

java - 如何获取虚拟机网卡的IP?

java - Boundless 和 Osgeo 版本之间有什么区别?

java - 后有 2 位数字的结果。例如 :23. 65

jquery - 使用 jQuery 在部分 View 中设置所选选项

ios - 支付你的钱 nsurl 错误空字符串

javascript - 从 JSON 对象创建新的 jQuery 数组

scala:抽象类实例化?

android - dex 在 Android 上为 Scala 构建 Ant 时失败