【问题标题】:How to run filter on demand scala play framework如何按需运行过滤器scala play框架
【发布时间】:2017-11-13 10:02:25
【问题描述】:

我正在开发一个带有 play 框架的 scala 应用程序,我创建了一个过滤器来过滤来自外部服务器的每个请求,但现在我被困在两天后如何按需运行过滤器,我有80 个 API 其中 30 个需要运行特定的过滤器,我如何在这样的请求中读取请求路由模板

 GET /api/v1/:locale/:uuid core.controllers.MyClass.myAction1(locale: String)
 GET /api/v1/:locale/:uuid/MyRoute core.controllers.MyClass.myAction2(locale: String)
 GET /api/v1/:locale/:uuid/Foo core.controllers.MyClass.myAction3(locale: String)
 GET /api/v1/:locale/orders/:orderId core.controllers.MyClass.myAction4(locale: String)

好吧,这些路线被放置在路线文件中, 在过滤器中,如果路线具有 :uuid 变量或 :orderId 变量,我需要检查天气以运行其特定的过滤器,因为它们的两个 id,我将它们作为 uuid所以我无法期待请求,我可以阅读路线模板吗?

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

    您可以从RequestHeader#attrs获取一些路由信息:

    // in your filter
    val handlerDef: Option[HandlerDef] = request.attrs.get(Router.Attrs.HandlerDef)
    

    HandlerDef api

    【讨论】:

    • 我认为这是最好的解决方案,我可以制作许多过滤器并注意 url 模板
    • 那么,为什么在 url 变量中显示这样的正则表达式 /api/v1/$locale/ 你能告诉我这里发生了什么
    • 路由文件在生成路由器实现之前被解释和解释。可以在路由文件中使用正则表达式:playframework.com/documentation/2.6.x/… 使用/api/v1/:locale/时会被重写为使用正则表达式,这样框架就可以直接使用了
    • .get 将其从选项中删除是否不安全? Router.Attrs.HandlerDef 什么时候不存在?
    【解决方案2】:

    如果您想从 80 个动作中选择 30 个来运行一些通用逻辑,您还可以考虑使用“动作构建器”来提供该逻辑。

    当你使用Action { ... } 时,你会得到一个普通的动作。您还可以创建自己的 MyAction { ... } 包装一个普通的 Action 并运行自定义逻辑。这是ActionBuilder。如果您使用这种方法,您只需更新您的 30 个操作以使用该自定义操作生成器。

    见:https://www.playframework.com/documentation/2.6.x/ScalaActionsComposition#Custom-action-builders

    【讨论】:

    • 我认为动作生成器会有点困难
    • 没问题,HandlerDef 也可以。实际上,我在 Play Framework 中编写了将 HandlerDef 存储在请求属性中的代码。 :) 操作构建器的好处是,事情的类型安全性和明确性更高——但有时过滤器是更好的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 2016-06-21
    • 2019-04-11
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多