无法读取操作过滤器中的请求正文
Unable to Read Request Body in Action Filter
给定以下 curl 命令:
curl -d "param1=value1¶m2=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
给定以下 curl 命令:
curl -d "param1=value1¶m2=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