抽象方法EssentialFilter.apply
当你创建一个EssentialFilter
返回一个EssentialAction
这基本上是一个函数RequestHeader
to an Iteratee[Array[Byte], Result]
play 会将 http 正文的传入字节块提供给其中。
如果您不熟悉 iteratee API,上面的签名基本上意味着,它将接受该类型的数据块Array[Byte]
并迟早会产生一个Result
从那些中。
正常播放Action
是 的子类EssentialAction
使用一个解析主体BodyParser
然后输入该结果(Request
它既是请求标头又是解析后的正文)到一个函数中,该函数又返回一个Future[Result]
所以如果你只有一个过滤器,那么next: EssentialAction
在你的过滤器中基本上是实际的控制器操作。你可以拿走它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
这将允许您查看已解析的请求。