11

我正在尝试编写一个类似于http://www.playframework.com/documentation/2.1.1/ScalaHttpFilters中描述的简单过滤器,但我需要访问请求正文。下面的文档指出“当我们调用 next 时,我们会返回一个 Iteratee。如果您愿意,可以将它包装在 Enumeratee 中以进行一些转换。” 我试图弄清楚如何包装 Iteratee,以便我可以将请求正文作为过滤器中的字符串获取,以便我也可以记录它。

4

3 回答 3

7

您必须知道的第一件事是当调用过滤器时,请求正文尚未解析。这就是为什么它给你一个RequestHeader. 您必须找出主体的类型,并相应地调用正确的主体解析器。

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

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

希望能帮助到你。

于 2013-07-24T10:24:09.267 回答
-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)

      }
    }
  }

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

于 2014-02-07T05:21:54.220 回答
-4

在路由到动作的控制器方法中,只需调用

Map<String, String[]> params = request().queryString();

这将为您提供参数映射,然后您可以在其中调用

params.get("someParam")[0] 

获取参数(如果它是单个值)。如果参数是一个列表,则忽略索引,这将返回一个数组。

于 2013-07-24T01:32:29.397 回答