ByteNoteByteNote
卸载 Apifox,换上这个 24MB 的开源 API 神器
字

字节笔记本

2026年10月5日 · 约 22 分钟读完

卸载 Apifox,换上这个 24MB 的开源 API 神器

API中转
¥120

用过 Apifox 的朋友大概率都有过这种体验:装一个 API 客户端,体积动辄两三百兆,吃掉大几百 MB 内存;团队集合锁在它的云和私有格式里,导出导不干净;想接进 CI 跑回归测试,还得折腾它的命令行。而 Postman 同样越做越重,Insomnia 已经停更。

最近有开发者在 X 上推荐了一个新选手:senda。一句话定位:

一个轻量级 API 客户端,集合就是本地文件夹里的 YAML 文件,用 Go + SolidJS 替代 Electron,二进制只有 ~24MB,支持桌面 GUI、终端 TUI 和 CI 命令行三种模式,天然支持 Git 追踪和 diff。

今天就来拆这个项目,看它凭什么值得你卸载 Apifox 换上去。

一、它要解决什么问题

senda 把自己定位成 Bruno 和 Postman 的"精神表亲",但先把现有工具(包括国内常用的 Apifox)的毛病列得明明白白:

现有工具的问题senda 怎么解
Apifox / Postman / Insomnia 把集合存在云端或私有格式,导出导不干净纯 YAML 文件,git diff 直接能用在你的请求上
Electron 应用动辄 150MB+ 二进制、吃 400MB 内存(Apifox 尤其吃内存)Wails + 原生 webview:~24MB 二进制,~100MB 内存
Bruno 接近了,但 bru 文件不是通用可读格式标准 YAML,没有自定义 DSL
团队集合的同步冲突噩梦集合就是文件夹:merge 冲突自然就解决了
重 UI 框架在大响应上卡顿SolidJS 细粒度响应 + 虚拟化的 CodeMirror 6

这张表几乎把 API 客户端的全部痛点一网打尽。核心思路只有一条:集合就是文件夹,请求就是 YAML 文件,一切都能 git 追踪。

二、技术栈:为什么是 Wails + SolidJS

senda 的技术选型很克制,每一层都有明确理由:

层技术为什么选它
桌面外壳Wails v3(Go)小二进制、原生 webview、Go 处理 HTTP/文件操作
前端SolidJS + TypeScript细粒度响应、极小打包、最少重渲染
编辑器CodeMirror 6虚拟化视口,20MB+ 文件不卡
存储纯 YAML(gopkg.in/yaml.v3)Git 可 diff、人可读、无自定义 DSL
前端工具链Bun(绝不用 npm/node)快速安装、统一构建/测试/运行
脚本引擎Goja纯 Go 的 JS VM,不依赖 Node、有沙箱
视觉测试Playwright基于截图的 UI 验证

这里最值得说的是 Wails。Electron 的痛点是:打包一个完整的 Chromium + Node.js,所以又大又吃内存。Wails 反过来:后端用 Go(编译成原生二进制),前端用系统自带的 webview(macOS 用 WebKit,Windows 用 WebView2,Linux 用 webkitgtk),不打包浏览器内核。

结果就是:~24MB 的二进制,~100MB 的内存占用,比 Electron 方案(150MB/400MB)轻了一个数量级。

而 SolidJS 选得也妙。React 的虚拟 DOM 在 API 客户端这种"频繁更新大块数据"的场景下会卡,SolidJS 的细粒度响应式只更新真正变化的部分,配合 CodeMirror 6 的虚拟化视口,20MB 的 JSON 响应也能丝滑渲染。

三、三种模式,一个二进制

这是 senda 最独特的设计:同一个 senda 二进制,三种工作模式,共享同一套发送管线(pipeline):

命令模式干什么
sendaTUI(默认)交互式三栏终端界面(树 | 请求 | 响应),完全在终端里干活
senda gui桌面 GUI启动 Wails 桌面应用
senda runCI 命令行无头运行器,可脚本化,集成进 CI

senda 一个二进制三种模式共享发送管线

为什么这个设计重要?

因为你可以在终端里快速调试一个请求,切到 GUI 做复杂操作,再在 CI 里用 senda run 跑回归测试,三者行为完全一致。脚本、变量、密钥、断言、cookie jar,三种模式下表现一模一样。

senda run 的 CI 用法特别实用:

bash
# 跑整个集合(或某个文件夹)
senda run -collection ./my-api -env dev

# 数据驱动:每个 CSV/JSON 行重复一次请求
senda run -collection ./my-api -data users.csv

# 生成机器可读的报告(json 或 junit XML)
senda run -collection ./my-api --report junit -o report.xml

它全过则退出 0,任一失败则退出 1,直接就能接进 CI 流水线。

四、数据格式:YAML 就是真理

senda 最核心的哲学:集合是普通文件夹,请求是标准 YAML 文件。

senda 集合目录与请求 YAML 示例

一个最小布局:

text
my-api/
├── .senda/                          # 所有非请求文件都放这,保持根目录干净
│   ├── senda.meta.yaml         # 集合元数据(名称、基础认证、基础变量)
│   ├── senda.secret.yaml       # gitignore 的集合密钥覆盖层
│   ├── environments/
│   │   ├── dev.yaml            # 环境变量
│   │   └── prod.secret.yaml    # gitignore 的密钥覆盖层
│   ├── mocks/                  # mock 服务器定义
│   ├── security/               # 同步的扫描模板
│   └── history.jsonl           # 发送记录(自动生成)
└── users/
    ├── list-users.yaml
    └── create-user.yaml

单个请求文件长这样:

yaml
name: Create user
method: POST
url: "{{baseUrl}}/users"
headers:
  - { key: Content-Type, value: application/json, enabled: true }
  - { key: Authorization, value: "Bearer {{token}}", enabled: true }
body:
  type: json
  raw: |
    { "name": "Ada Lovelace", "email": "ada@example.com" }
asserts:
  - { target: status, op: eq, value: "201" }
  - { target: body, op: contains, value: "ada@example.com" }
preScript: |
  req.setHeader("X-Request-ID", crypto.randomUUID());
postScript: |
  senda.setVar("userId", res.json.id);

注意几个设计细节:

  • 变量插值 {{var}} 用在 URL、headers、body 里,优先级是:运行时(脚本)、环境、集合基础、请求
  • 密钥隔离:*.secret.yaml 文件被 gitignore,只在发送时合并,永远不会被提交
  • 断言内置:每个请求可以带 asserts,每次发送都跑,也支持 JSON Schema 校验

这意味着你的整个 API 测试套件就是一堆可读、可 diff、可 review 的 YAML 文件。code review 可以 review 请求,git blame 能追溯谁改了哪个 header,merge conflict 能自然解决。

五、功能:不止是发请求

senda 的功能列表长到让人意外:它不只是 Postman 的替代品,更像是 Postman + Bruno + 一堆周边工具的合集。

核心工作流

  • 全部 HTTP 方法(GET/POST/PUT/PATCH/DELETE/HEAD/OPTIONS)
  • 多请求标签页,状态跨重启保留
  • 可调整的三栏布局(侧边栏 | 请求编辑器 | 响应查看器)

请求编辑

  • Body 类型:JSON、raw、form-urlencoded、multipart、GraphQL(一键 schema 自省 + 字段自动补全)
  • 认证:Bearer、Basic、API key、OAuth 2,可按请求或继承自集合
  • 每行 header/body 可单独启用/禁用

响应查看

  • 状态码、耗时、大小一目了然
  • 大响应处理:Go 把内联 body 限制在 2MiB,UI 显示大小并提供"强制显示"出口
  • 视口渲染:只画可见行,20MB JSON 不卡

测试与断言

  • 断言定义:target / operator / value
  • 目标:状态码、响应时间、body 大小、JSON path、header 值、原始 body
  • 操作符:eq/neq/contains/matches(正则)/gt/lt/exists 等
  • JSON Schema 校验:设 responseSchema: 就每次发送校验

脚本

  • Pre-request 脚本:发送前用 JS 沙箱改 headers/params/body
  • Post-request 脚本:响应后提取 token、设变量、记日志
  • 用 Goja(纯 Go 的 JS 引擎),5 秒防死循环保护

集合运行

  • 文件夹运行器:顺序执行文件夹内所有请求
  • 压测:并发虚拟用户(VU)模式,可配时长、目标 RPS、最大 VU,实时报告 p50/p95/p99 延迟

Mock 服务器

  • 从 .senda/mocks/ 的 YAML 直接起一个本地 HTTP 服务器,不用写代码
  • 规则路由(匹配方法+路径,选响应变体)和有状态资源路由(内存 CRUD)
  • {{...}} 响应模板(路径参数、假数据、uuid、now),可实时切换的场景
  • 能从 OpenAPI 规格生成 mock,或把真实响应存成 fixture
  • 也能无头跑:senda mock

安全扫描

  • 内置 nuclei 兼容的 HTTP 检查包,对文件夹下每个请求的解析 URL 跑扫描
  • 按严重度和标签过滤,运行前预览确切检查数
  • 能从任何 nuclei 兼容的 Git 仓库拉额外模板

实时通信

  • WebSocket:连 ws://wss://,发帧,看实时消息日志
  • SSE:连 Server-Sent Events 端点,实时流式事件

导入与代码生成

  • 导入:curl 命令、Postman v2.0+ 集合、OpenAPI 3.0/3.1 规格
  • 生成代码:curl、fetch、httpie、Python requests、Go net/http
  • 生成 API 文档:渲染成 Markdown 或独立 HTML(senda docs)

开发者体验

  • 命令面板(Ctrl+K):模糊搜索请求、切环境、触发动作
  • 13 个内置主题(Catppuccin、Nord、VS Code、单色、粉彩),明/暗独立选择,跟随系统
  • 键盘快捷键齐全
  • 历史:每次发送记到 .senda/history.jsonl
  • 文件监听:YAML 被外部编辑(git pull、$EDITOR)时自动刷新
  • 源码控制面板:只读显示工作区 vs HEAD 的改动,对请求 YAML 做语义化逐字段 diff
  • Cookie jar:跨发送和运行的持久会话 cookie
  • 代理 & mTLS:每集合的上游代理和客户端证书

这份清单基本覆盖了一个 API 开发者日常需要的所有工具。

六、最诚实的地方:它是 vibe-coded 的

这是 senda 最特别、也最值得关注的一点。README 顶部就坦白:

Heads up: Senda is largely AI-assisted ("vibe-coded"), most of the code and docs were written by pairing with Claude, with a human steering the direction. It's young and experimental.

在"How this was built"章节更详细:

Senda is largely vibe-coded, most of the code, tests, and docs were written with heavy AI assistance (Claude), with me steering the direction and deciding what shipped. It's young, lightly used, and maintained by one person, so treat it as experimental. The source is plain Go and YAML, so when in doubt, read the diff.

这个坦诚值得尊敬。大多数项目讳莫如深 AI 参与度,senda 反而把它当作重要信息放在最显眼的位置。

而且作者很清醒地给出了应对:"when in doubt, read the diff"(拿不准就看 diff)。因为代码是纯 Go 和 YAML,没有魔法,任何疑问都能通过读源码解决。这恰恰是"可审计性"对 vibe-coded 项目最重要的意义。

这也引出一个有意思的观察:senda 用 AI 写代码,本身又是给开发者用的工具,而它的卖点之一是"git-native",可追踪、可 diff、可审计。 这三层叠加起来,恰好是 AI 辅助开发时代的一个范本:用 AI 快速造一个工具,但让这个工具本身的产出保持最大程度的透明和可验证。

七、怎么装

senda 的安装方式覆盖了所有主流渠道:

bash
# Shell 安装器(Linux/macOS)
curl -fsSL https://raw.githubusercontent.com/this-senda/senda/main/scripts/install.sh | sh

# Homebrew
brew install this-senda/tap/senda

# Windows PowerShell
irm https://raw.githubusercontent.com/this-senda/senda/main/scripts/install.ps1 | iex

# winget
winget install this-senda.Senda

# Chocolatey
choco install senda

需要提醒的是:二进制还没代码签名,首次启动系统会警告:

  • macOS Apple Silicon 上可能显示"Senda is damaged",这其实是签名缺失,不是真的损坏。清除隔离标志即可:

    sh
    xattr -dr com.apple.quarantine /Applications/Senda.app
  • Windows SmartScreen 可能拦截,点 More info 后选 Run anyway

作者很实在地解释了每种情况,下载本身是完整的(可以校验 SHA-256)。

八、为什么这个项目值得关注

读完整个仓库,我觉得 senda 击中了 API 客户端市场的三个长期痛点,而且解法都很正:

第一,"重"的问题。 Postman 从一个 Chrome 插件膨胀成一个需要登录账号的云平台,Electron 外壳吃 400MB 内存。senda 用 Wails 把体积压到 24MB,这不是炫技,是每天打开工具的人都能感受到的差异。

第二,"锁"的问题。 Postman 把你的集合锁在它的云和私有格式里。Bruno 解了一半,但 bru 格式还是自定义的。senda 直接用标准 YAML:你的 API 定义属于你,属于 git,属于任何文本工具。

第三,"边界"的问题。 大多数 API 客户端要么是纯 GUI(Postman),要么是纯 CLI(httpie)。senda 用一个二进制覆盖了 GUI/TUI/CI 三种场景,共享同一套管线,这意味着你的请求定义可以在开发者本地、终端、CI 流水线之间无缝流动。

再加上它vibe-coded 的诚实背景,让这个项目成了观察"AI 辅助开发能走多远"的一个真实样本:一个人,配 AI,造出了一个功能完整、跨平台、24MB 的专业工具。

九、路线图

v0.1 对日常 API 工作已经功能完整。接下来计划的方向(intent, not a promise):

  • 密钥编辑 UI:在应用里管理 *.secret.yaml(打开时自动 gitignore 的功能已经通过 gitguard 实现了)
  • gRPC:和 HTTP、GraphQL 并列的一等公民 gRPC 请求

十、怎么拿

  • 仓库:github.com/this-senda/senda
  • 平台:Linux / macOS / Windows 全平台
  • 协议:MIT License
  • 作者:this-senda(一人维护,AI 辅助开发)
  • 体积:~24MB 二进制,~100MB 内存

一句话总结:集合是文件夹,请求是 YAML,二进制 24MB,三种模式一个管线。 senda 不是又一个 Apifox/Postman 仿品,而是把"API 客户端本该怎样"这件事重新想了一遍。如果你也被重型客户端的内存占用和私有格式锁困扰,值得一试。

适合这些人:天天泡在终端和 git 里的开发者、受够了 Electron 卡顿和 Apifox 内存占用的人、想把 API 测试纳入 CI 的人、以及所有相信"配置即文件"哲学的人。

本文基于 senda 项目仓库(this-senda/senda)整理。该项目为 vibe-coded(AI 辅助开发)实验性项目,单人维护,使用前建议读 diff。

想深入了解同方向的方案,还可以看看 Wails 框架(wails.io)、SolidJS,以及同样是 git-native API 客户端的 Bruno(senda 的精神表亲)。

相关文章

分享: