Scala播放http过滤器:如何查找请求体

Non*_*nos 9 scala playframework playframework-2.1

我正在尝试编写类似于http://www.playframework.com/documentation/2.1.1/ScalaHttpFilters中描述的简单过滤器,但我需要访问请求体.下面的文档说明"当我们接下来调用时,我们会返回一个Iteratee.如果你愿意的话,你可以将它包装在一个Enumeratee中进行一些转换." 我正在试图找出如何包装Iteratee,以便我可以将请求体作为过滤器中的字符串,这样我也可以记录它.

小智 6

首先要知道的是,在调用Filter时,尚未解析请求体.这就是为什么它会给你一个RequestHeader.你必须找出身体的类型,并相应地调用正确的身体解析器.

您可以在CSRF过滤器中找到正文解析的示例(它可以在请求正文的第一个字节中查找CSRF令牌).

请参阅:https://github.com/playframework/playframework/blob/master/framework/src/play-filters-helpers/src/main/scala/csrf.scala#L221-L233.

希望能帮助到你.

  • 链接到源文件已损坏 (4认同)

Set*_*ron -1

我在这上面花了一些时间。我并不是 Scala 专家,但这非常有效!:)

object AccessLog extends EssentialFilter {
  def apply(nextFilter: EssentialAction) = new EssentialAction {
    def apply(requestHeader: RequestHeader) = {
      val startTime = System.currentTimeMillis

      nextFilter(requestHeader).map { result =>
        val endTime = System.currentTimeMillis
        val requestTime = endTime - startTime

        val bytesToString: Enumeratee[ Array[Byte], String ] = Enumeratee.map[Array[Byte]]{ bytes => new String(bytes) } 
        val consume: Iteratee[String,String] = Iteratee.consume[String]()    
        val resultBody : Future[String] = result.body |>>> bytesToString &>> consume

        resultBody.map {
          body =>
            Logger.info(s"${requestHeader.method} ${requestHeader.uri}" +
          s" took ${requestTime}ms and returned ${result.header.status}")
            val jsonBody = Json.parse(body)
            Logger.debug(s"Response\nHeader:\n${result.header.headers.toString}\nBody:\n${Json.prettyPrint(jsonBody)}")
        }

         result.withHeaders("Request-Time" -> requestTime.toString)

      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

最终结果将把正文打印为 Json 字符串(打印得很漂亮)。

  • 抱歉,但这会打印请求的响应正文,而不是请求的正文 (18认同)