elli 路由实战指南:掌握 URL 路径匹配与参数提取的 10 个技巧
elli 路由实战指南掌握 URL 路径匹配与参数提取的 10 个技巧【免费下载链接】elliSimple, robust and performant Erlang web server项目地址: https://gitcode.com/gh_mirrors/ell/ellielli 是一个简单、健壮且高性能的Erlang web server它的路由方式非常独特——不依赖路由表或正则匹配而是直接用 Erlang 的模式匹配处理URL 路径。对于刚接触 Erlang Web 开发的朋友来说理解 elli 路由的底层逻辑能让你写出更简洁、更高效的 HTTP API。本文用 10 个实战技巧带你完整掌握 elli 的 URL 路径匹配与参数提取。技巧 1先理解 elli 路由的核心模型 在 elli 中每个 HTTP 请求都会进入你实现的一个回调模块callback核心是handle/2函数。elli 会提前把 URL 路径拆分成二进制段列表你的任务就是用模式匹配去接住它。handle(Req, _Args) - handle(Req#req.method, elli_request:path(Req), Req).elli_request:path/1返回的是类似[hello, world]的列表而拆分的实现藏在 elli_http.erl 的split_path/1里按/分割并过滤空段。理解了这一点后面所有技巧都顺理成章。技巧 2用二元组列表精确匹配 URL 路径段 elli 路由就是逐段模式匹配。例如要匹配/hello/world只需写handle(GET, [hello, world], _Req) - {ok, [], Hello World!};这段代码来自官方示例 elli_example_callback.erl。方法GET/POST 路径段列表双条件匹配清晰直观这就是 elli 路由优雅的地方。技巧 3利用通配变量实现动态路径段 ✨如果你的路径包含动态部分比如用户 ID直接用变量去匹配那一段即可handle(GET, [user, UserId], Req) - {ok, [], User: , UserId/binary};因为路径已经被拆分成列表变量UserId自动捕获对应的二进制段无需写任何正则表达式。这也是 elli 路由性能优异的原因——模式匹配是 Erlang 虚拟机最擅长的操作。技巧 4永远准备一个 404 兜底子句 ️没有任何匹配时请求会落入最后的万能子句。强烈建议所有回调模块都以它结尾handle(_, _, _Req) - {404, [], Not Found}.这样未定义的路由会返回规范的 404而不是抛异常导致 500。这同样来自 elli_example_callback.erl是生产环境的必备习惯。技巧 5用 get_arg/3 提取 GET 查询参数 URL 中的查询参数query string例如/hello?nameerlang可用elli_request:get_arg/3提取handle(GET, [hello], Req) - Name elli_request:get_arg(name, Req, undefined), {ok, [], Hello , Name/binary};第三个参数是默认值参数缺失时返回它避免崩溃。elli 内部用proplists:get_value查找见 elli_request.erl查询参数已被自动解析成 proplist。技巧 6URL 解码参数用 get_arg_decoded 当参数包含中文或特殊字符时URL 会进行百分号编码如%E4%BD%A0%E5%A5%BD。此时必须使用get_arg_decoded/3做解码handle(GET, [decoded-hello], Req) - Name elli_request:get_arg_decoded(name, Req, undefined), {ok, [], Hello , Name/binary};实现细节在 elli_request.erl它会先取出原始值再用http_uri:decode还原成可读文本。凡是涉及用户输入文本的场景记得用 decoded 版本。技巧 7一次性获取全部 GET 参数 需要遍历所有查询参数时用get_args/1拿到完整的 proplistArgs elli_request:get_args(Req), %% Args [{name, erlang}, {foo, true}]注意没有值的参数如?flag在列表中对应的是{Key, true}而不是字符串处理时别忘了这个细节。需要解码版本可以改用get_args_decoded/1二者对比如下API返回值是否解码get_args/1原始 proplist否get_args_decoded/1解码后的 proplist是技巧 8提取 POST 表单参数 POST 请求的application/x-www-form-urlencoded表单体用post_arg/3提取单个字段handle(POST, [hello], Req) - Name elli_request:post_arg(name, Req, undefined), City elli_request:post_arg_decoded(city, Req, undefined), {ok, [], Hello , Name/binary, of , City/binary};底层由body_qs/1解析请求体见 elli_request.erl并且它会检查Content-Type头——不是表单类型时直接报错。批量获取可用post_args/1或post_args_decoded/1与 GET 版本一一对应。技巧 9从 raw_path 直接取查询字符串 某些场景如日志记录、透传参数需要原始查询串用query_str/1Qs elli_request:query_str(Req), %% 请求 /search?qerlangpage2 时返回 qerlangpage2实现逻辑在 elli_request.erl对raw_path按?分割取后半段没有则返回空二进制。配合elli_request:raw_path/1可以拿到完整的原始路径。技巧 10用中间件编排多路由与统一处理 生产环境通常不止一个 handlerelli 提供了elli_middleware把多个模块串成管道见 elli_middleware.erlConfig [ {mods, [ {my_auth_middleware, []}, {elli_middleware_compress, []}, {my_router_callback, []} ]} ], elli:start_link([{callback, elli_middleware}, {callback_args, Config}]).某个中间件返回ignore时请求会继续传给下一个模块返回具体响应则短路结束。利用这一机制你可以把路由router、鉴权、压缩拆分成独立模块各司其职。认证失败还可以像官方示例那样throw({403, [], Forbidden})快速短路见 elli_example_callback.erl。总结让 elli 路由成为你的利器 ⚡回顾这 10 个技巧elli 路由的精髓在于**路径即列表、匹配即路由**——elli_request:path/1负责拆分handle/2的模式匹配负责分发get_arg/post_arg系列负责参数提取。只要掌握这套组合拳无论是简单的 REST API 还是复杂的多模块服务你都能用最少的代码写出清晰、健壮、高性能的 Erlang Web 服务。上手试试吧把上面的技巧用在你的第一个 elli 路由里【免费下载链接】elliSimple, robust and performant Erlang web server项目地址: https://gitcode.com/gh_mirrors/ell/elli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考