elli 快速上手指南:10 个代码片段轻松编写你的第一个 REST API

📅 2026/8/18 17:44:19
elli 快速上手指南:10 个代码片段轻松编写你的第一个 REST API
elli 快速上手指南10 个代码片段轻松编写你的第一个 REST API【免费下载链接】elliSimple, robust and performant Erlang web server项目地址: https://gitcode.com/gh_mirrors/ell/ellielli 是一个简单、稳健且高性能的 Erlang Web 服务器专为高吞吐、低延迟的 HTTP API 场景而生。如果你正在寻找一个轻量级的 Erlang HTTP 服务器来搭建 REST APIelli 无疑是值得一试的选择它没有厚重的框架包袱核心只是一个回调Callback模型配合 rebar 几分钟就能跑起来。本文将通过 10 个可直接复用的代码片段带你从零上手 elli快速编写出你的第一个 REST API。 elli 是什么为什么选择它elli 的定位非常纯粹只做 Web 服务器该做的事HTTP 解析、连接管理、响应输出业务逻辑全部交给你自己的回调模块。它的特点包括特性说明 简单只需实现handle/2和handle_event/3两个回调函数⚡ 高性能默认 20 个 acceptor 进程并发接受连接底层直接操作 socket️ 稳健对异常请求、客户端断开、超时都有完善的事件通知机制 可扩展中间件机制支持请求预处理、响应后处理如自动 gzip当前版本为 1.0.5采用 MIT 协议可以放心用于商业项目。 第一步获取源码并编译ell 项目使用 rebar 构建克隆仓库后直接编译即可git clone https://gitcode.com/gh_mirrors/ell/elli cd elli make compile编译完成后ebin/目录下就是编译好的 beam 文件。项目自带rebar脚本无需额外安装构建工具。你可以把ebin加入 Erlang 的代码路径-pa ebin或者通过 rebar 的deps机制引入到自己的项目中。 核心概念回调模块elli 的设计思想是服务器框架 你的回调模块。你的模块只需遵循src/elli_handler.erl中定义的 behaviour实现两个函数handle/2处理每个 HTTP 请求返回响应handle_event/3接收启动、请求完成、异常等事件通知下面这个最简模块就是完整的Hello World-module(my_callback). -behaviour(elli_handler). -export([handle/2, handle_event/3]). handle(Req, _Args) - {ok, [], Hello, World!}. handle_event(_Event, _Data, _Args) - ok.启动服务器同样简单在你的 supervisor 或测试 shell 中elli:start_link([{callback, my_callback}, {port, 8080}]).访问http://localhost:8080/就能看到响应了。✨ 10 个代码片段从入门到进阶片段 1最小的 Hello World 服务这是最基础的形式返回{ok, Headers, Body}三元组。ok等价于状态码200Headers为空列表表示不附加任何响应头handle(_Req, _Args) - {ok, [], Hello, World!}.也可以省略状态码简写为{200, hello}见src/elli_example_callback.erl中的shorthand路由。片段 2按方法与路径路由分发elli 最大的乐趣在于路由就是模式匹配。elli_request:path/1会把 URL 路径拆成二进制列表配合 HTTP 方法直接匹配handle(Req, _Args) - handle(Req#req.method, elli_request:path(Req), Req). handle(GET, [users], _Req) - {ok, [], user list}; handle(GET, [users, Id], _Req) - {ok, [], user: , Id/binary}; handle(_, _, _Req) - {404, [], Not Found}.无需任何路由框架一个函数头就是一个路由规则清晰又高效。片段 3读取 GET 查询参数elli_request:get_arg/3从 URL 查询字符串取值第三个参数是默认值get_arg_decoded/3则自动做 URL 解码handle(GET, [hello], Req) - Name elli_request:get_arg(name, Req, world), {ok, [], Hello , Name/binary};访问/hello?nameelli会返回Hello elli。片段 4读取 POST 表单参数POST 表单application/x-www-form-urlencoded同样一条 API 搞定handle(POST, [users], Req) - Name elli_request:post_arg(name, Req, anonymous), {ok, [], created user: , Name/binary};需要解码时使用post_arg_decoded/3所有解析逻辑封装在src/elli_request.erl中开箱即用。片段 5设置响应头与内容协商通过响应头可以轻松实现内容协商根据客户端的Accept头返回不同格式handle(GET, [info], Req) - case elli_request:get_header(Accept, Req, text/plain) of application/json - {ok, [{Content-Type, application/json}], {\lang\:\erlang\}}; _ - {ok, [{Content-Type, text/plain}], lang: erlang} end.片段 6返回 JSON 数据结合jsx或jsone等 JSON 库返回 JSON 只需设置正确的Content-Typehandle(GET, [users, Id], _Req) - Body jsx:encode([{id, Id}, {name, elli}]), {ok, [{Content-Type, application/json}], Body};片段 7重定向 302 与 304 Not Modified设置Location头即可实现重定向返回304时 elli 会自动不发送响应体配合自定义Etag头非常适合做缓存handle(GET, [redirect], _Req) - {302, [{Location, /users}], }; handle(GET, [cached], _Req) - {304, [{Etag, abc123}], ignored};片段 8统一 404 与异常处理兜底子句返回 404而在回调中throw异常时elli 会返回 500 并触发request_throw事件方便你记录日志handle(_, _, _Req) - {404, [], Not Found}; handle(GET, [crash], _Req) - throw(something_went_wrong).更妙的是你还可以在throw里直接带状态码实现短路的授权拦截throw({403, [], Forbidden}).片段 9流式 chunked 响应SSEelli 原生支持 chunked 传输适合做 Server-Sent Events 或实时推送。返回{chunk, Headers}后在任意进程中发送数据块handle(GET, [events], Req) - Ref elli_request:chunk_ref(Req), spawn(fun() - send_events(Ref) end), {chunk, [{Content-Type, text/event-stream}]}. send_events(Ref) - elli_request:send_chunk(Ref, [data: ping\n\n]), timer:sleep(1000), elli_request:close_chunk(Ref).参考src/elli_example_callback.erl中的chunk_loop/1它演示了循环发送 10 个数据块的完整写法。片段 10中间件与 gzip 压缩elli 的中间件机制让功能扩展变得优雅。将{callback, elli_middleware}与{mods, [...]}组合即可串联多个处理模块Config [ {mods, [ {my_auth_middleware, []}, %% 自定义中间件 {elli_middleware_compress, []}, %% 自动 gzip {my_callback, []} %% 最终业务回调 ]} ], elli:start_link([{callback, elli_middleware}, {callback_args, Config}, {port, 8080}]).其中elli_middleware_compress会自动对超过 1024 字节的响应体做 gzip 压缩参考src/elli_middleware_compress.erl你的业务代码完全无感知。中间件返回ignore时请求会继续传递给下一个模块实现短路与分流。⚙️ 常用配置项一览启动 elli 时通过 proplist 传入配置见src/elli.erl的初始化逻辑配置项默认值说明callback必填回调模块名port8080监听端口min_acceptors20acceptor 进程数越大并发越高request_timeout60000整体请求超时毫秒header_timeout10000读取请求头超时body_timeout30000读取请求体超时max_body_size1024000请求体大小上限字节ssl/keyfile/certfilefalse启用 HTTPS 监控与运维小贴士elli 提供了几个实用的管理 APIelli:get_acceptors(Pid). %% 查看当前 acceptor 进程数 elli:get_open_reqs(Pid). %% 查看正在处理的请求数 elli:set_callback(Pid, NewMod, Args). %% 热更新回调模块配合handle_event/3中的request_complete事件包含请求各阶段的时间戳你可以收集请求耗时搭建自己的监控看板。 总结通过这 10 个代码片段你应该已经感受到 elli 的简洁与强大纯 Erlang 模式匹配式路由、零依赖的回调设计、完善的超时与异常事件体系让 REST API 开发回归本质。无论是快速原型还是高并发生产服务elli 都是 Erlang 生态里值得信赖的选择。现在就克隆项目把第一个{ok, [], Hello}跑起来吧【免费下载链接】elliSimple, robust and performant Erlang web server项目地址: https://gitcode.com/gh_mirrors/ell/elli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考