gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:13:44 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com