gpt4 book ai didi

spray - 如何在自定义指令中获取请求上下文?

转载 作者:行者123 更新时间:2023-12-04 23:50:04 26 4
gpt4 key购买 nike

我正在用 Spray 编写一个自定义指令,用于管理任何用户请求的速率限制。

我要一个 LimitManager某个地方将处理每个请求的自定义限制和规则。这个唯一需要的信息LimitManageruserInfocurrentRoute ,即不同路线的不同限制。

所以我可能最终会有这样的指令:

def ensureLimit(): Directive0 =
if (LimitManager.isAuthorized(userInfo, currentRoute)) {
pass
} else {
reject
}

如何在指令中获取请求上下文,以便向我的 LimitManager 提供正确的信息?

最佳答案

在 Spray 中,每个指令都是 Route 上的一个函数,它是函数 RequestContext => Unit 的别名.但是在强大的 Scala 隐含的帮助下,路由 DSL 有助于隐藏这一点,但您可以编写如下内容:

val route: Route = get { (ctx: RequestContext) => // this can be omitted, just for info
ctx.complete("Hello")
}

它与:
val route: Route = get { complete("Hello") }

但是有一些复杂的语法技巧。

记住! 你永远不应该这样写:
val route = get { ctx =>
complete("Alloha")
}

在这里 complete将转换为 ctx => ctx.complete("Hello") ,因此您将根据您的请求返回此函数,并且不会完成真正的请求。

因此,一种方法可以做到这一点,只需将其作为参数传递即可。您也可以使用 extract指令,获取上下文然后使用 mapflatMap制作你自己的:
val myDirective = extract(identity) map { ctx => /* Your directive */ } 

关于spray - 如何在自定义指令中获取请求上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24581264/

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