使用play解析scala中的HTTP请求JSON正文
我正在将Scala与Play一起使用,并寻找一种更简洁的方法来编写以下POST请求处理程序:使用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
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主体解析器。现在,请求主体自动包含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)}