gpt4 book ai didi

erlang - cowboy支持多少条路由?

转载 作者:行者123 更新时间:2023-12-04 02:35:51 25 4
gpt4 key购买 nike

我正在寻找一种在 Cowboy 中将任意路径(存储在数据库中)映射到特定博客文章的方法。

也就是说:我有几千篇博文,每篇都可以通过几个名称访问,例如规范 URL(例如 /post/42)、一些别名(例如 /2013/11/25/erlang-rocks),历史位置(例如/path-on-old-blog/12345)等

我知道我可以简单地使用一个包罗万象的路线:

{ "/[...]", catch_all_handler, [] },

...然后在数据库中查找路径,但我正在考虑从数据库中创建路由,如下所示:

Posts = posts:all(),
Paths = [get_handlers_for_post(P) || P <- Posts],
Routes = lists:flatten(Paths),

get_handler_for_post(P) ->
% Generate a list of paths with IDs from the database.
% Return something that looks like this:
% [{"/canonical/1", post_handler, [1]},
% {"/first-alias", post_handler, [1]}].
% TODO: code goes here...

即:将所有可能的路径放在路由器中,指向同一个处理程序,每个处理程序都有帖子的ID。

问题是:这合理吗? cowboy支持多少条路由?

最佳答案

你可以做,但没有必要。 Cowboy 在路由中有一个非常有效的模式匹配语法。让我们以您在示例中给出的路线为例

[{"/canonical/1", post_handler, [1]},
{"/first-alias", post_handler, [1]}].

第一个 url 有一个可选的附加路径。在 cowboy 中,您可以将这两条路线表示为

"/:first/[:second]"

这匹配/canonical/1以及/first-alias

first 和 second 都是参数化的,它们可以取任何值。 :second 左右的方括号表明这是可选的。上面的模式将匹配您提供的两条路线。

那么您实际上如何在路由处理程序中访问这些参数?

其实很简单。 Cowboy 在 cowboy_req 模块中提供了一个绑定(bind)方法,您可以像这样从那里访问您的 url 的参数

cowboy_req:binding(first,Req)

如果是你的第一个 url,这将返回 {<<"canonical">>,Req} .

注意参数是一个 atom .使用参数和可选参数,你应该能够匹配你的整个 url 集合。

阅读更多关于路由的信息 here

更多解释

据我了解,您有数千篇不同的博客文章,而且它们的网址并不一致。我的建议不是动态创建路由,而是找到一致 url 的模式并将它们分组到路由中。 cowboy 自动回退。如果它与模式不匹配,它会查找另一个模式,依此类推。

例如

\:a\:b

将匹配

\hello\man , hello\world , \hello\slash\

不匹配hello\man\world .

\:a\:b\[:c]

将匹配 \hello\man , hello\world , hello\man\world

路由数量没有硬性限制。您可以根据需要拥有任意数量。

关于erlang - cowboy支持多少条路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20880013/

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