库 / SDK
HashLoad/horse avatar
HashLoad/horse

Horse 3.3:用 Delphi 写 REST 服务的 Express 式框架,值得一试吗?

项目速览:Delphi 的快速、固执己见、简约的 Web 框架。 Horse 是一个受 Express 启发的 Delphi 和 Lazarus Web 框架。

1,376 个 Star247 个 ForkPascalMIT
GitHub

秒懂

它是什么?
Horse 是面向 Delphi 和 Lazarus 的极简 Web 框架,模仿 Express 的 API 风格。本文基于其 README 和文档目录,分析它的路由、中间件、Provider 机制,以及多实例和内存缓冲池等特性,并指出它的适用边界。
适合谁用?
Horse 适合那些已经用 Delphi 或 Lazarus 写业务逻辑、不想引入重量级框架的团队。它把 Express 的路由和中间件模型搬到了 Pascal 世界,用 boss install horse 一条命令就能装好,十分钟能跑起一个 /ping 服务。
能商用吗?
可以。MIT 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库最近一次提交在 3 天前。
用什么语言写的?
主要是 Pascal(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月19日)和我们的分析,不构成法律意见。

开源项目深度解析

它解决什么问题:Delphi 世界里缺一个 Express

Delphi 社区长期缺少一个轻量的 HTTP 框架。老项目用 IdHTTPServer 直接写,路由和参数解析全靠手工,代码很快变成一团。Horse 把 Express 的 API 风格搬过来:THorse.Get('/ping', procedure...) 定义一个路由,Res.Send('pong') 返回响应。它面向的是已经用 Delphi 或 Lazarus 写桌面或服务端程序的开发者,这些人不想为了一个 REST 接口去学一套全新的框架。Horse 的定位是极简,只做 HTTP 层,不掺和数据库或模板。它解决的痛点是:用最少的样板代码,把现有的 Pascal 业务逻辑暴露成 HTTP 服务。

路由与中间件:Express 的骨架,Pascal 的血肉

路由的写法几乎和 Express 一致。THorse.Get 接受路径和匿名过程,路径里可以带参数,文档目录里有 routing.md 专门讲路由参数、路由分组和查询字符串。中间件机制也照搬了 Express 的 Next 过程:每个中间件可以决定是继续往下传还是直接返回响应。文档里强调注册顺序很重要,顺序错了行为会变。这一点和 Express 一样,新手容易踩坑。Horse 的生命周期钩子比 Express 更细:onRequest、preParsing、preValidation、onSend、onResponse,五个阶段可以插入自定义逻辑。这意味着你可以在解析请求体之前做鉴权,或者在发送响应之后记日志。

Provider 机制:同一套代码,换不同的网络引擎

Horse 最独特的设计是 Provider。Provider 是真正持有 socket 的传输层,路由处理器不关心底层是 Indy 还是 http.sys。你在编译时用一个条件定义来选择 Provider,代码本身不用改。默认情况下,Delphi 用 Indy,Lazarus 用 fphttpserver。想要异步 I/O,可以定义 HORSE_CROSSSOCKET 或 HORSE_PROVIDER_MORMOT,这两个第三方 Provider 分别基于 IOCP 和 epoll/kqueue。Windows 上还有内置的 HttpSys Provider,直接驱动操作系统的 http.sys 内核态 HTTP 栈,也就是 IIS 用的那个。这个设计很实用:开发时用 Indy,部署到 Linux 服务器时换 epoll,业务代码一行不动。但要注意,CrossSocket 和 mORMot2 Provider 是 freitasjca 的个人仓库,不是 HashLoad 官方维护,出问题时的响应速度要自己评估。

多实例和内存缓冲池:为高并发做的准备

文档目录里有两个特性值得注意:Multi-Instance 和 Memory Buffer Pool。多实例允许你在同一个进程里跑多个相互独立的 HTTP 服务器,每个服务器有自己的端口和路由表,互不干扰。这对于微服务拆分或者在同一进程里提供管理接口和业务接口很有用。内存缓冲池是一个线程安全的 buffer 回收机制,目的是消除堆分配,减少 GC 压力。文档说这是 high-performance 的,但 README 里没有给出任何基准数字,所以性能提升幅度无法确认。这两个特性说明 Horse 不是只给玩具项目用的,它在认真考虑并发场景。但多实例也意味着你要自己管理每个实例的生命周期,文档里没有说清楚实例间如何共享状态,这需要你自己去读 multi-instance.md 才能弄明白。

安装与起步:boss 一条命令,但 IDE 集成要另装

安装依赖 boss,这是 HashLoad 自己的包管理器。命令是 boss install horse。装完之后,Delphi 的快速开始代码只有几行:在 uses 里加 Horse,定义 THorse.Get('/ping'),然后 THorse.Listen(9000)。Lazarus 的写法略有不同,需要先声明一个过程,但同样简洁。可选的 Horse Wizard 提供 IDE 集成,但那是另一个仓库,不在核心包里。如果你不想用 boss,也可以手动把源码路径加进 IDE 的 Library Path,但 README 没提这个,只推荐了 boss。对于没有用过 boss 的团队,这多了一个学习成本。另外,文档目录里有 compiler-support.md,列出了支持的 Delphi 和 FPC 版本,但在 README 里看不到具体版本号,所以老版本编译器能不能用,得自己去查。

WebSocket 与流式响应:原生支持,但文档深度未知

Horse 声称原生支持 WebSocket(RFC 6455)和流式传输(Web Streams / SSE)。文档目录里有 websocket.md 和 streaming.md 两个专门文件。这意味着你不必为了 WebSocket 再引入一个第三方库,Horse 自己就能处理双向连接。SSE 对服务器推送场景很实用,比如实时日志或通知。但 README 里只给了链接,没有展示任何代码示例,所以实际的 API 长什么样,比如怎么建立连接、怎么处理消息帧,完全不清楚。我无法确认它是像 Express 的 ws 库那样简单,还是需要自己处理底层细节。如果你打算在项目里用 WebSocket,建议先读那两个文档再决定。

可观测性与测试:有追踪和指标,但集成成本要自己算

文档目录里有 telemetry.md,提到 OpenTelemetry 分布式追踪和 Prometheus 指标采集。还有 integrity-testing.md,讲自动化集成测试、Access Violation 恢复和 SO 限制测试。这说明 Horse 在运维层面不是空白。但问题在于,这些功能是内置的还是需要额外中间件?README 没有说。从目录结构看,telemetry.md 是独立文档,可能只是指南,而不是内置实现。你仍然需要自己写中间件来暴露 /metrics 端点,或者接入 OpenTelemetry SDK。对于一个小型框架来说,有文档指引总比没有好,但你要做好自己动手的打算。

维护与许可:MIT 协议,更新频繁,但版本节奏要留意

Horse 采用 MIT 许可证,可以自由使用和修改。仓库最近一次推送是 2026 年 8 月,三天内发布了三个版本(3.3.0 到 3.3.2),说明维护很活跃。但活跃也意味着 API 可能变动,升级时要注意 changelog。文档目录里有 roadmap,说明项目有长期规划,但具体内容在 README 里看不到。对于企业项目,依赖一个三天发三个版本的框架,需要建立自己的升级测试流程。另外,第三方 Provider 的许可证和维护状态不在 Horse 仓库里,那是各仓库自己的事。

编辑结论

Horse 适合那些已经用 Delphi 或 Lazarus 写业务逻辑、不想引入重量级框架的团队。它把 Express 的路由和中间件模型搬到了 Pascal 世界,用 boss install horse 一条命令就能装好,十分钟能跑起一个 /ping 服务。如果你需要 IOCP 或 epoll 级别的异步 I/O,可以换 CrossSocket 或 mORMot2 Provider,但要注意这些是第三方仓库,维护节奏不在 HashLoad 手里。如果你只跑 Windows 上的内网服务,默认的 Indy 或内置的 HttpSys 就够用。不适合的场景是:你的团队没有 Delphi 正版授权,或者你期待一个自带 ORM、模板引擎和完整生态的全栈框架,Horse 只负责 HTTP 层。采用前先验证三件事:确认你的 Delphi 版本在 compiler-support 文档列出的范围内,检查 boss 能否在你的 CI 环境里正常拉取依赖,以及读一遍 doc/middleware.md 里关于中间件注册顺序的说明,顺序错了路由行为会不符合预期。

官方来源

  1. Official README
  2. Project repository
  3. Release notes
社区笔记

社区笔记