scala – 基本过滤器中的访问请求主体Play Framework 2
我是
Scala的新手.
如 https://www.playframework.com/documentation/2.3.x/ScalaHttpFilters中的play框架官方文档中所述:
但是没有任何方法可以访问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时实现的抽象方法EssentialFilter.apply返回一个EssentialAction,它基本上是一个从RequestHeader到Iteratee [Array [Byte],Result]的函数,其中play将提供http正文的传入字节块.
如果你不熟悉iteratee API,那么上面的签名基本上意味着,它将接受Array [Byte]类型的数据块,并且迟早会产生一个Result. 正常播放Action是EssentialAction的子类,它使用BodyParser解析主体,然后将结果(请求,即请求头和解析后的主体)提供给一个函数,该函数又返回一个Future [Result] 因此,如果您只有一个过滤器,那么接下来:过滤器中的EssentialAction基本上是实际的控制器操作.您可以使用它的Iteratee [Array [Bytes],Result]并用一些东西包装它,这样就可以在身体解析器触摸它之前访问请求的主体. 因此,要实现您想要的功能,您需要了解Iteratees的工作原理以及如何使用Enumeratees转换或查看输入到迭代中的数据. 一些起点 play框架文档有一些关于iteratees的非常好的信息:https://www.playframework.com/documentation/2.3.x/Iteratees 詹姆斯·罗珀(扮演技术主管)也有一篇很好的博客文章可能会有所帮助: 重要的提示 过滤器如何在游戏中工作,因此无法使用过滤器查看已解析的主体.除非你创建一个将解析主体的枚举,但仍然将字节传递给实际的动作(这将使你解析主体两次). 如果这是您想要的,那么最好使用ActionBuilder并创建自己的自定义Action,以便查看已解析的请求. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在bash脚本中通过ssh在远程主机上执行命令
- angularjs – ui-bootstrap-tpls.min.js和ui-bootstrap.min
- Angular2提供自定义Http不工作
- angularjs – 如何模拟在提供者私有函数中手动注入的$windo
- AngularJs 入门(二)--模块
- angularjs – Angular Controller和controllerAs指令中的关
- 調用webservice時出現HTTP狀態417:Expectation Failed的解決
- 使用JAX-WS创建webservice服务,含服务端及客户端
- Angular2项目日常开发中所遇问题及解决方案记录
- 用于单个服务器的轻量级Docker orchestrator