我正在开发一个接受JSON数据的Web服务。有时输入数据附带图像或某些PDF文件等附件。在这种情况下,这些数据作为多部分数据出现。
我需要创建接受两种内容类型的动作。根据内容类型,它应该能够解析json并从json中检索附件相关的元数据,然后下载附件。
我有两个分别处理事情的行动
def multiPartAction: Action[MultipartFormData[Array[Byte]]] = Action(multipartFormDataAsBytes)={request =>
...
}
第二个动作
def handleJSon: Action[JsValue] = Action.async(parse.json) {
request =>
...
}
如何在一个动作中一起处理这两个动作?
答案 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")
}