使用play解析scala中的HTTP请求JSON正文

使用play解析scala中的HTTP请求JSON正文,scala,playframework,Scala,Playframework,我正在将Scala与Play一起使用,并寻找一种更简洁的方法来编写以下POST请求处理程序: def create = Action.async { request => { request.body.asJson match { case Some(x) => x.validate[UserDto] match { case c: JsSuccess[UserDto] => doActualWork(c.get) cas

我正在将Scala与Play一起使用,并寻找一种更简洁的方法来编写以下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(""))
    }
  }
  }
问题:

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

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

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

    建议在这里指出哪里出了问题,而不是说
    错误的json主体

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

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

    建议在这里指出哪里出了问题,而不是说
    糟糕的json正文

    更简洁的方法是使用播放正文解析器

    def create = Action.async(parse.json[UserDto]) { request =>
      doActualWork(request.body)
    }
    
    json正文解析器将验证请求的内容类型是否为
    application/json
    ,如果请求不符合预期,则返回
    415不支持的媒体类型
    响应。因此,您不需要再次检查操作代码

    注意:如果您的客户端未发送内容类型,您可以尝试使用:

    parse.tolerantJson
    -这稍微轻松一点


    这是因为
    动作
    特征实际上定义为:

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

    更简洁的方法是使用播放主体解析器

    def create = Action.async(parse.json[UserDto]) { request =>
      doActualWork(request.body)
    }
    
    json正文解析器将验证请求的内容类型是否为
    application/json
    ,如果请求不符合预期,则返回
    415不支持的媒体类型
    响应。因此,您不需要再次检查操作代码

    注意:如果您的客户端未发送内容类型,您可以尝试使用:

    parse.tolerantJson
    -这稍微轻松一点


    这是因为
    动作
    特征实际上定义为:

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

    您可以使用他们的json主体解析器来减少一些噪音。尽管json是您想要的thr类型,但您仍然需要进行一些验证。你也可以进一步抽象它,但我在我的手机上,所以我还不能以我过去的一种方式来编写代码。你可以使用他们的json主体解析器来减少一些噪音。尽管json是您想要的thr类型,但您仍然需要进行一些验证。你也可以进一步抽象它,但是我在我的手机上,所以我现在还不能用我过去做过的一种方式来编写代码。你可以把它做得更短:
    def create=Action.async(parse.json[UserDto]){request=>doActualWork(request.body)}
    你可以把它做得更短:
    def create=Action.async(parse.json[UserDto]){request=>doActualWork(request.body)}