无法读取操作过滤器中的请求正文

Unable to Read Request Body in Action Filter

给定以下 curl 命令:

curl  -d "param1=value1&param2=value2" -H "Content-Type: application/x-www-form-urlencoded"  -X POST http://localhost:9000/go

下面的操作过滤器不记录请求正文的内容:

import akka.stream.Materializer
import javax.inject.Inject
import play.api.Logging
import play.api.mvc.{ActionFilter, PlayBodyParsers, Request, Result}

import scala.concurrent.{ExecutionContext, Future}

class SomeActionFilter @Inject()(parse: PlayBodyParsers)(
  implicit materializer: Materializer,
  val executionContext: ExecutionContext
) extends ActionFilter[Request]
    with Logging {
  override protected def filter[A](request: Request[A]): Future[Option[Result]] =
    parse.formUrlEncoded.apply(request).run().map {
      case Left(result) => Some(result)
      case Right(formUrl) =>
        logger.info(formUrl.toString)
        None
    }
}

为什么不呢?通往 Right(formUrl) 的代码分支确实得到执行,但日志的输出是一个空字符串。

Playframework 团队 here 解决了这个问题,方法如下:

request.asInstanceOf[Request[AnyContent]].body.asFormUrlEncoded