Scala Play 2.5.0 2.5.1通过访问结果体进行过滤

Scala Play 2.5.0 2.5.1通过访问结果体进行过滤,scala,logging,playframework,playframework-2.5,Scala,Logging,Playframework,Playframework 2.5,在游戏2.5.x中,我没有找到将尸体放入过滤器的方法。 我想创建一个“BadRequestLogFilter”,如果我的应用程序返回状态代码400-500,它应该记录请求和结果 在Play 2.4.x中,我使用了Iteratees,它很有效。 我无法将这段代码迁移到播放2.5.x。有人能给我一个提示吗?也许用打孔法把尸体放进过滤器是个坏主意 这是我的旧(在2.4.x中工作正常)过滤器,用于播放2.4.x class BadRequestLogFilter @Inject() (implicit

在游戏2.5.x中,我没有找到将尸体放入过滤器的方法。 我想创建一个“BadRequestLogFilter”,如果我的应用程序返回状态代码400-500,它应该记录请求和结果

在Play 2.4.x中,我使用了Iteratees,它很有效。 我无法将这段代码迁移到播放2.5.x。有人能给我一个提示吗?也许用打孔法把尸体放进过滤器是个坏主意

这是我的旧(在2.4.x中工作正常)过滤器,用于播放2.4.x

class BadRequestLogFilter @Inject() (implicit val mat: Materializer, ec: ExecutionContext) extends Filter {
  val logger = Logger("bad_status").underlyingLogger

  override def apply(next: (RequestHeader) => Future[Result])(request: RequestHeader): Future[Result] = {
    val resultFuture = next(request)
    resultFuture.foreach(result => {

      val status = result.header.status
      if (status < 200 || status >= 400) {
        val c = Try(request.tags(Router.Tags.RouteController))
        val a = Try(request.tags(Router.Tags.RouteActionMethod))

        val body = result.body.run(Iteratee.fold(Array.empty[Byte]) { (memo, nextChunk) => memo ++ nextChunk })
        val futResponse = body.map(bytes => new String(bytes))
        futResponse.map { response =>

          val m = Map("method" -> request.method,
            "uri" -> request.uri,
            "status" -> status,
            "response" -> response,
            "request" -> request,
            "controller" -> c.getOrElse("empty"),
            "actionMethod" -> a.getOrElse("empty"))

          val msg = m.map { case (k, v) => s"$k=$v" }.mkString(", ")
          logger.info(appendEntries(m), msg)
        }
      }
    })
    resultFuture
  }
}

游戏2.5.x中的结果主体为类型

因此,一旦你得到了结果,你就可以得到身体,然后将其具体化:

val body = result.body.consumeData(mat)
这里的
mat
是您拥有的
隐式物化器。这将返回一个
Future[ByteString]
,然后您可以对其进行解码以获得字符串表示(为了简单起见,我省略了Future处理):

val body = result.body.consumeData(mat)
val bodyAsString = body.decodeString("UTF-8")
logger.info(bodyAsString)