首页 > 解决方案 > 无法在操作过滤器中读取请求正文

问题描述

给定以下 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) 的代码分支确实被执行,但日志的输出是一个空字符串。

标签: scalaplayframework

解决方案


Playframework 团队在这里通过使用强制转换解决了这个问题,如下所示:

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

推荐阅读