Play(Scala)在同一操作中处理不同的Content-Type

时间:2014-05-27 05:25:00

标签: scala playframework

我正在开发一个接受JSON数据的Web服务。有时输入数据附带图像或某些PDF文件等附件。在这种情况下,这些数据作为多部分数据出现。

我需要创建接受两种内容类型的动作。根据内容类型,它应该能够解析json并从json中检索附件相关的元数据,然后下载附件。

我有两个分别处理事情的行动

    def multiPartAction: Action[MultipartFormData[Array[Byte]]] = Action(multipartFormDataAsBytes)={request =>
...
}

第二个动作

 def handleJSon: Action[JsValue] = Action.async(parse.json) {
    request =>
...
}

如何在一个动作中一起处理这两个动作?

1 个答案:

答案 0 :(得分:1)

你可以指定你自己的身体解析器,它是两个的组合,类似于它的完成方式here,或者保留身体解析器,坚持默认的AnyContent体型。然后:

def action = Action { request =>
  val body: AnyContent = request.body
  val jsonBody: Option[JsValue] = body.asJson
  val multipartBody: Option[MultipartFormData[TemporaryFile] =
    body.asMultipartFormData

  (jsonBody map getResponseForJson) orElse
    (multipartBody map getResponseForAttachment) getOrElse
    BadRequest("Unsupported request body")
}