【问题标题】:Parsing HTTP request JSON body in scala with play在 scala 中使用 play 解析 HTTP 请求 JSON 正文
【发布时间】:2016-10-05 20:40:30
【问题描述】:

我在 Play 中使用 Scala,并在下面寻找一种更简洁的方式来编写 POST 请求处理程序:

  def create = Action.async { request => {
    request.body.asJson match {
      case Some(x) => x.validate[UserDto] match {
        case c: JsSuccess[UserDto] => doActualWork(c.get)
        case e: JsError => Future.successful(BadRequest(""))
      }
      case None => Future.successful(BadRequest(""))
    }
  }
  }

问题:

  1. 解析 JSON 对象 UserDto 需要很多行(这是一个常见的过程)
  2. 高度嵌套(可读性差)

【问题讨论】:

  • 你可以使用他们的 json body parser 来减少一些噪音。尽管 json 是您想要的类型,但您仍然需要进行一些验证。你也可以进一步抽象它,但我在我的手机上,所以我还不能提供我过去做过的一种方式的代码

标签: scala playframework


【解决方案1】:

更简洁的方法是使用 Play body parser

def create = Action.async(parse.json[UserDto]) { request =>
  doActualWork(request.body)
}

json 正文解析器将验证请求的 Content-Type 是否为 application/json,如果请求不符合预期,则返回 415 Unsupported Media Type 响应。因此,您无需再次检查您的操作代码。

注意:如果您的客户端没有发送您可以尝试使用的 Content-Type:

parse.tolerantJson - 这个比较轻松


这是因为Action trait 实际上被定义为:

trait Action[A] extends (Request[A] => Result) {
  def parser: BodyParser[A]
}

【讨论】:

    【解决方案2】:

    使用 json 正文解析器。现在请求正文自动包含 json,您可以摆脱外部模式匹配。

    def create = Action.async(parse.json) {
        _.body.validate[UserDto] match {
          case JsSuccess(value, _) => doActualWork(value)
          case _ => Future.successful(BadRequest("bad json body"))
        }
      }
    

    建议在这里说出问题所在而不是bad json body

    【讨论】:

    • 你可以让它更短:def create = Action.async(parse.json[UserDto]) { request => doActualWork(request.body) }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多