Вы можете представить, что Playframework работает с запросом как конвейер.
A filter - это правильное место для регистрации запросов, но, как вы обнаружили, он не имеет доступа к телу .Основная причина этого в том, что на этом этапе тело не анализируется .Фильтр может отклонять несоответствующий запрос только по заголовкам, не нужно тратить ресурсы на анализ тела.Это основная идея фильтров.
Следующий этап в конвейере - это action .Если вам нужно что-то сделать с телом запроса , то вам нужно использовать состав действий .К сожалению, вам нужно обернуть \ заменить каждое действие составным действием.
Документация
https://www.playframework.com/documentation/2.5.x/ScalaActionsComposition
Пример (из документации)
Определение действия регистрации:
def logging[A](action: Action[A])= Action.async(action.parser) { request =>
Logger.info("Calling action")
action(request)
}
object LoggingAction extends ActionBuilder[Request] {
def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = {
block(request)
}
override def composeAction[A](action: Action[A]) = new Logging(action)
}
Использовать его:
def index = LoggingAction {
Ok("Hello World")
}
def index = Logging {
Action {
Ok("Hello World")
}
}