Посмотрите документацию Play для объединения анализаторов тела:
http://www.playframework.com/documentation/2.2.0/ScalaBodyParsers
Если вы хотите ограничить тело сообщения только XML или JSON, вы можете написать что-то вроде этого:
val xmlOrJson = parse.using {
request =>
request.contentType.map(_.toLowerCase(Locale.ENGLISH)) match {
case Some("application/json") | Some("text/json") => play.api.mvc.BodyParsers.parse.json
case Some("application/xml") | Some("text/xml") => play.api.mvc.BodyParsers.parse.xml
case _ => play.api.mvc.BodyParsers.parse.error(Future.successful(UnsupportedMediaType("Invalid content type specified")))
}
}
def test = Action(xmlOrJson) {
request =>
request.body match {
case json: JsObject => Ok(json) //echo back posted json
case xml: NodeSeq => Ok(xml) //echo back posted XML
}
}
Функция xmlOrJson просматривает заголовок запроса типа содержимого, чтобы определить анализатор тела. Если это не xml или json, он возвращает анализатор тела ошибки с ответом UnsupportedMediaType (HTTP 415).
Затем вы передаете эту функцию в качестве анализатора тела любого действия, которое хотите ограничить содержимым XML или JSON. В рамках действия вы можете посмотреть на тело, чтобы определить, был ли проанализирован xml или json, и обработать его соответствующим образом.