Playframework Scala Action Async多重验证?

时间:2018-06-13 08:49:26

标签: scala playframework

在我的Playframework应用程序中,我使用异步操作来验证来自前端的帖子数据。

有没有办法对两个模型进行验证?

目前它看起来像这样

request.body.asJson.map(_.validate[ContentModel] match { case JsSuccess(contentComponent, _) =>

但我发送两个不同的模型到后端。

先谢谢

1 个答案:

答案 0 :(得分:2)

将多个可能的数据输入混合到同一个REST端点通常是一个坏主意,这有点使REST的整个点无效。

如果可能的话,我会为不同的数据模型创建一个单独的路由,并让客户端根据导致它产生不同数据有效负载的条件调用不同的端点。

POST /api/v1/process/a  controllers.Bla.doStuffA()
POST /api/v1/process/b  controllers.Bla.doStuffB()

在后端,如果需要,您可以拥有数据模型的ADT,并使您的路由逻辑专用于该ADT的叶子,后者在该ADT的任何部分使用相同的服务方法。

trait ContentModel
case class ContentModelA(....) extends ContentModel
case class ContentModelB(...) extends ContentModel

现在你可以:

def processModel(data: ContentModel) = {
  data match {
    case ContentModelA(...) =>
    case ContentModelB(...) =>
  }
}

因此,您的doStuffAdoStuffB控制器方法类似于:

def doStuffA = Action.async { implicit req => req.body.asJson.map(_.validate[ContentModelA].map(processData) }

def doStuffB = Action.async { implicit req => req.body.asJson.map(_.validate[ContentModelB].map(processData) }

如果必须

从最严格的意义上回答你的问题:

val jsonOpt = request.body.asJson

jsonOpt map { payload =>
  payload.validate[ContentModelA] match {
    case JsSuccess() => ... we have an A Model
    case JsError(err, paths) => 
      // couldn't deal with A, let's try B
      payload.validate[ContentModelB] match {
        case JsSuccess() => //we have a B
        case JsError(err, paths) => // oops, neither A nor B.
      }

  }
}

你可以用一个非常花哨的无形副产品来做这件事,同时使用副产品中的所有类型的格式样张,并从那里开始,但我认为这会将它吹出公园。