gpt4 book ai didi

scala - 基本过滤器 Play Framework 2 中的访问请求正文

转载 作者:行者123 更新时间:2023-12-05 01:00:47 25 4
gpt4 key购买 nike

我是 Scala 的新手。
https://www.playframework.com/documentation/2.3.x/ScalaHttpFilters 中的 play 框架官方文档中所述:

Play provides a lower level filter API called EssentialFilter which gives you full access to the body of the request.



但是在 requestHeader 中没有任何方法可以访问请求正文目的。
import play.api.Logger
import play.api.mvc._
import play.api.libs.concurrent.Execution.Implicits.defaultContext

object LoggingFilter 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
Logger.info(s"${requestHeader.method} ${requestHeader.uri}" +
s" took ${requestTime}ms and returned ${result.header.status}")
result.withHeaders("Request-Time" -> requestTime.toString)
}
}
}
}

最佳答案

抽象方法EssentialFilter.apply您在创建 EssentialFilter 时实现的返回 EssentialAction这基本上是一个来自 RequestHeader 的函数到 Iteratee[Array[Byte], Result]其中 play 将提供 http 正文的传入字节块。

如果您不熟悉 iteratee API,上面的签名基本上意味着,将接受类型为 Array[Byte] 的数据块的东西。迟早会产生 Result从那些。

正常播放ActionEssentialAction 的子类使用 BodyParser 解析正文然后将结果( Request 既是请求 header 又是解析的正文)输入到一个函数中,该函数又返回一个 Future[Result]
所以如果你只有一个过滤器,那么 next: EssentialAction在您的过滤器中基本上是实际的 Controller 操作。您可以使用它的 Iteratee[Array[Bytes], Result]并用一些东西包裹它,这样就可以在正文解析器接触它之前访问请求的正文。

因此,要实现您想要的目标,您需要了解一点如何Iteratees作品及使用方法 Enumeratees转换或查看输入到迭代器中的数据。

一些起点

play 框架文档有一些关于迭代器的很好的信息:https://www.playframework.com/documentation/2.3.x/Iteratees

James Roper(扮演技术负责人)还有一篇不错的博客文章可能会有所帮助:
https://jazzy.id.au/2012/11/06/iteratees_for_imperative_programmers.html

重要的提示

过滤器的工作原理使得无法使用过滤器查看解析后的主体。除非您创建一个枚举对象来解析正文但仍将字节传递给实际操作(这将使您解析正文两次)。

如果这是您想要的,最好使用 ActionBuilder并创建您自己的自定义 Action这将允许您查看解析的请求。

关于scala - 基本过滤器 Play Framework 2 中的访问请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29047510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com