Scala Play 2.1 : Accessing request and response bodies in a filter

标签 scala playframework playframework-2.0

我正在编写一个过滤器来记录所有请求及其响应

    object LoggingFilter extends EssentialFilter {
  def apply(next: EssentialAction) = new EssentialAction {
    def apply(rh: RequestHeader) = {
      val start = System.currentTimeMillis

      def logTime(result: PlainResult): Result = result match {
        case simple @ SimpleResult(header, content) =>
            val time = System.currentTimeMillis - start
            play.Logger.info(s"${rh.method} ${rh.uri} took ${time}ms and returned ${header.status}")
            result
        case _ => result
      }
      next(rh).map {
        case plain: PlainResult => logTime(plain)
        case async: AsyncResult => async.transform(logTime)
      }
    }
  }
}

我还需要记录请求和响应正文。这些被埋在迭代器/枚举器中,是否有一种更简单的方法来访问主体而无需详细了解迭代器的工作原理?
否则如何将请求和响应正文转换为字符串?

最佳答案

如果要捕获 SimpleResult 响应正文,请使用以下命令:

def logTime(result: PlainResult): Result = result match {
  case simple @ SimpleResult(header, content) => {
    val time = System.currentTimeMillis - start
    SimpleResult(header, content &> Enumeratee.map(a => {
      play.Logger.info(s"${rh.method} ${rh.uri} took ${time}ms and returned ${header.status} with body ${a}")
      simple.writeable.transform(a)
    }))
  }
  case _ => result
}

检查 json 的 mimetype:
def logTime(result: PlainResult): Result = {
  result.header.headers.get(HeaderNames.CONTENT_TYPE) match {
    case Some(ct) if ct.trim.startsWith(MimeTypes.JSON) => result match {
      case simple @ SimpleResult(header, content) =>
        val time = System.currentTimeMillis - start
        SimpleResult(header, content &> Enumeratee.map(a => { 
          play.Logger.info(s"${rh.method} ${rh.uri} took ${time}ms and returned ${header.status} with body ${a}")
          simple.writeable.transform(a) 
        }))
    }
    case ct => result
  }
}

关于Scala Play 2.1 : Accessing request and response bodies in a filter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17752151/

相关文章:

Scala 延续 : many shifts in sequence

sql - Play框架忽略进化脚本

postgresql - 如何为 Postgres DB 配置 Slick 3.0.0(使用或不使用 Hikari)Typesafe Play conf

scala - 如何在 Play Framework 2 中为我的所有路由添加前缀?

playframework-2.0 - Play Framework 2.0 在服务器启动时安排 Akka Actor

scala - 在 Scala 中表达平方

java - 在不使用具有长参数列表的构造函数的情况下构建大的、不可变的对象

scala - 如何在 Scala 中实现通用数学函数

Play2 中 inputRadioGroup 的 Java 示例

java - Play Framework : No output shown in the browser