gpt4 book ai didi

scala - PlayFramework FakeRequest 返回 400 错误

转载 作者:行者123 更新时间:2023-12-03 04:19:01 26 4
gpt4 key购买 nike

在 route :

POST        /login                  controllers.ApplicationCtrl.login()

在 Controller 中:

  def login = Action(parse.json) { implicit request => {

val email = (request.body \ "email").as[String]
val password = (request.body \ "password").as[String]

Ok(Json.toJson(
Map("status" -> "OK",
"message" -> "%s created".format(email))
))
}

测试中

 "login" in new WithApplication{

val request = route( FakeRequest(
Helpers.POST,
controllers.routes.ApplicationCtrl.login.url,
FakeHeaders(Seq(CONTENT_TYPE -> Seq("application/json"))),
""" {"email" : "bob@mail.com", "password" : "secret"} """
)).get

status(request) must equalTo(OK)

}

当我使用命令行测试时:

curl --header "Content-type: application/json" --request POST --data '{"email" : "bob@mail.com", "password" : "secret"}' http://localhost:9000/login

它得到了理想的回应。

{"status":"OK","message":"bob@mail.com created"} 

但是测试返回400错误

出了什么问题?

(命令行测试因简单性和易理解性而获胜)

最佳答案

这里发生的是 Play 根据正文的类型设置请求的内容类型。您使用的是字符串正文,以便您设置的内容类型 header 稍后会被text/plain覆盖; charset=utf-8.

因为您将正文显式解析为 Json,所以如果内容类型不是 text/jsonapplication/json,正文解析器将返回错误请求 403 .

针对您的情况,最好的办法是使用 Json 主体,即:

"login" in new WithApplication {

val request = route( FakeRequest(
POST,
controllers.portal.routes.Portal.test.url,
FakeHeaders(Seq.empty),
play.api.libs.json.Json.obj("email" -> "bob@mail.com", "password" -> "secret")
)).get

status(request) must equalTo(OK)
}

请注意,您可以通过让备用 FakeRequest 构造函数从调用中推断出操作的方法和 URL,从而使其更加简洁:

val request = route(FakeRequest(controllers.portal.routes.Portal.test)
.withBody(Json.obj("email" -> "bob@mail.com", "password" -> "secret"))).get

可用作正文参数的数据类型及其内容类型映射:

  • JsValue -> application/json
  • NodeSeq -> text/xml
  • 字符串 -> 文本/纯文本
  • Map[String, Seq[String]] -> application/x-www-form-urlencoded
  • 数组[字节] -> 无

还可以选择使用 operativeJson 作为主体解析器来完全跳过检查内容类型。

关于scala - PlayFramework FakeRequest 返回 400 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28247112/

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