10MB开源API客户端Bruno:轻量本地优先,用Git告别Postman重量与登录墙
作为一个每天要和几十个接口打交道的后端开发Postman 陪我熬过了很多年。但最近两年我是越来越不想打开它应用启动转圈、加载更新提示、读团队 Workspace一套流程下来少说十秒多的时候半分钟起步一旦集合多了、环境多了内存占用轻松超过 500MB电脑风扇呼呼转。更让我难受的是账号体系不登录不让用登录之后接口数据又被默认推到云端有些公司内部接口我真不想让它们离开本地硬盘。所以我开始认真找替代品最后留在手里的是一个安装包只有 10MB 上下、双击后几乎秒开、完全本地存储、还支持 Git 协作的开源 API 客户端。这篇就聊聊它到底是谁、为什么能做到这么轻、以及我把它用在日常调试和团队协作中的完整经验。如果你也是被 Postman 的重量和登录墙劝退的人这篇应该对你有用。1. 为什么我换掉了 Postman1.1 被重量、启动速度和登录墙拖垮的日常先说清楚我不是一上来就为了“炫技”才换工具。Postman 功能确实全但它的重是真实感受到的而且是越用越重。早期 Postman 还只是个 Chrome 插件轻快得很。后来转向独立桌面应用体积就开始膨胀。如果你看过安装目录就会发现现在的 Postman 动不动几百 MB安装包也有 100MB 以上。这个体量对我来说已经不是一个“接口调试工具”而是一个“全家桶应用”。启动时它要初始化的东西太多检查更新、加载用户信息、同步云端集合、渲染一堆团队插件和扩展。我实测过冷启动通常要 8 到 15 秒有时候电脑负载高一点30 秒都有可能。你想想我就想拿它发一个 GET 请求看一眼返回数据结果要等半分钟这还是“工具”吗另一个问题是账号绑定。Postman 的新版本基本就是强制登录不登录啥也干不了。哪怕你用离线模式界面上也全是让你创建账号、登录、订阅的引导。这带来两个麻烦一是内部接口数据被迫经过它的云端同步敏感业务接口我根本不想上传二是免费版功能被不断收窄一些好用的协作能力、自动化能力被划到付费墙后面。说实话我也理解商业公司要赚钱但对一个每天高频使用的轻量工具来说这种“云优先 账号墙”的模式就有点过了。1.2 找替代品时我到底在考量什么想换工具得先想清楚自己对“替代品”的核心诉求是什么。我给自己列了四个硬性标准必须足够轻安装包和内存占用都要小启动速度必须快最好打开就用。数据必须本地优先接口数据、环境变量、脚本都保存在本地文件里我随时能备份、能 grep、能放进版本控制。可以没有云同步但必须有团队协作能力我接受用 Git 做接口集合的同步与评审。脚本和自动化不能太弱日常调试之外我还要把接口测试跑进持续集成流水线。按这个标准我把市面上常见的工具过了一遍。Insomnia 是一个经典候选它界面清爽脚本能力也还行但新版也开始推账号体系和云同步本地优先的定位被削弱了。Apifox 功能是真全接口调试、Mock、文档、测试一把抓但我个人用起来感觉它更像“团队协作平台”重量也不比 Postman 轻多少尤其我只需要一个调试器的时候它有点杀鸡用牛刀。HTTPie Desktop 风格独特命令行体验好但图形界面的功能丰富度一般脚本和团队协作用得别扭。最后留下的是 Bruno它没有账号体系、没有云同步把接口集合直接映射成磁盘上的文本文件用 Git 做版本管理和多人协作。最打动我的是它的“克制”安装包只有 10MB 量级启动不到 1 秒完全围绕本地离线和文件优先设计而且开源代码放在公众视野下不会出现“今天还能免费用明天就锁进付费墙”这种事。2. 10MB 替代品的技术底牌2.1 “文件即接口”看清 .bru 到底是个什么格式很多第一次接触 Bruno 的人会问它的集合数据存在哪里答案很简单存在你本地的文件夹里而且不是那种加密的二进制数据库是纯文本文件。在 Bruno 里一个 Collection集合本质上就是一个文件夹每个 Request请求是一个以.bru结尾的文本文件里面用可读的标记语言记录了请求的所有信息。我随手打开一个登录接口的 .bru 文件内容大概是这样的meta { name: 用户登录 type: http seq: 3 } post { url: {{baseUrl}}/api/auth/login body: json auth: none } headers { Content-Type: application/json User-Agent: Bruno-Test/1.0 } body:json { { username: {{username}}, password: {{password}} } } auth:bearer { token: {{token}} }看到没有URL、Headers、Body、鉴权方式都以明文形式躺在文件里。这意味着你可以直接打开这个文件去读去改也可以把它提交到 Git 里做 Diff。团队里一个新人接手项目clone 仓库后打开 Bruno点开集合文件夹所有接口定义、脚本、环境变量都在根本不需要“导出再导入”的传递流程。这也是我特别喜欢的点接口文件不再是黑盒而是项目仓库的一部分和代码一样被管理、被评审、被记录变更历史。2.2 轻量到底轻在哪启动快到底快在哪很多人以为“10MB 安装包 秒开”意味着功能弱其实不是。Bruno 能做到这么轻主要是因为它很克制砍掉了大量“重服务”。首先它没有账号系统和云同步模块启动时不需要向服务器验证身份、拉取集合、同步状态自然少了一大堆网络请求和等待。数据全部存在本地磁盘打开集合就是扫描文件夹并解析文本文件这个过程对现代电脑来说几乎是无感的。其次它的 UI 和功能路径非常聚焦没有复杂的团队管理面板、订阅计费页面、模板市场之类的东西代码量少加载的资源就少。最后它的运行时设计是“即用即走”没有常驻后台进程不主动检查更新你做接口调试时它就是干干净净一个窗口。我实测下来的数据很直观安装包大约 10-15MB安装完成后占用存储只有几十 MB双击图标到界面可交互几乎在 1 秒以内打开一个包含 20 多个请求的集合也就是一瞬间的事。相比之下Postman 光是常驻内存经常就跑到 500MB 以上这差距不是一点半点。2.3 它用 Git 替代了云同步这一步走对了Bruno 最让我觉得“设计想清楚”的地方是它用一个开发者本来就熟悉的工具——Git——来替代云同步和团队协作。云同步的思路是数据放到服务商的服务器上客户端登录后拉取最新数据。这个模式对个人用户方便但对团队来说有痛点免费版有容量和成员数限制敏感接口数据放别人服务器上总归有点不放心多人同时编辑一个集合时容易互相覆盖。Git 的思路则完全不同集合就是仓库里的目录每个请求和脚本都是文件提交、分支、合并、评审都可以走标准的开发流程。我实际使用中收获最大的是 Code Review 能力。同事改了一个接口的 Header 或者请求体提交的变更我能直接在 Merge Request 里看到哪个字段变了、为什么变一目了然。这在 Postman 的云端协作里是做不到的因为你就不知道同事什么时候动过集合也不会留下可审计的痕迹。3. 从安装到日常调试完整上手流程3.1 下载安装与界面初识Windows / macOS / UbuntuBruno 是开源项目直接去官网或 GitHub Release 页面下载对应平台的安装包就行不用找什么“免登录版本”因为它压根没有登录系统安装完就能用。Windows 和 macOS 都很简单下载安装包一路下一步。macOS 用户注意如果系统有 Gatekeeper 提示右键打开或者到“系统设置-隐私与安全性”里允许一次就行这是常见问题不是病毒。Ubuntu 我单独说一下因为很多人装 .deb 包会遇到依赖问题。推荐用 apt 直接安装本地包sudo apt install ./bruno_1.x.x_amd64.deb这样 apt 会自动处理依赖基本不会报错。装完之后命令行输入bruno或者直接点应用图标就能打开。如果你用的是 Arch也可以从 AUR 安装包名搜索 bruno-bin 即可。界面是英文的但我建议你不用急着找“汉化版”因为常用菜单就那么几个左侧是集合列表中间是请求编辑区右侧是响应区底部还有 Console 和测试结果。常用的词无非是 New Collection、New Request、Environment、Settings用两天就能记住。顺便一提Bruno 的快捷键也很顺手比如Ctrl/Cmd S保存请求Ctrl/Cmd Enter发送请求效率比鼠标点快不少。3.2 创建集合并发出第一个请求第一步新建一个 Collection。点击左侧的新建按钮给它取个名字比如“电商项目接口”然后确认。此时你会在本地某个目录看到它对应的文件夹生成。第二步在 Collection 上右键选择 New Request填写请求名称比如“用户登录”。进入请求编辑界面后你会看到 Method、URL、Headers、Body 这些熟悉的入口。我先试一个最简单的 GET 请求Method 选择 GETURL 填https://api.example.com/health点击右上角的 Send响应区会立刻返回状态码、响应时间和响应体整个过程非常跟手没有任何卡顿。我拿它做一次接口连通性排查比用浏览器 DevTools 还方便因为 URL、Header、参数可以保存下次直接复用。第三步再来一个 POST 接口测试。Method 改成 POST填上接口地址在 Headers 里加一行Content-Type: application/jsonBody 选择 JSON 格式然后填{ username: admin, password: 123456 }点击 Send看返回结果。这就是最常用的接口调试流程和 Postman 的操作习惯非常接近从那边切换过来的学习成本极低。3.3 环境变量与动态值别把敏感信息写死接口调试里最常见的痛点之一就是把 URL、Token 这类信息写死在每个请求里。换环境就要逐个改效率低还容易出错。Bruno 对这个问题提供了一个非常顺手的方案环境变量。点击左侧 Environments新建一个环境比如“开发环境”然后添加变量变量名变量值baseUrlhttp://192.168.1.100:8080usernameadminpassword123456之后在 URL、Headers、Body 里就能用{{baseUrl}}、{{username}}这种占位符引用了。切换环境时只需要在右上角下拉框选择对应的环境所有请求里的变量都会自动切换。比如你现在对接到的是测试环境复制一个环境把 baseUrl 改成http://test.example.com剩下的请求一个都不用改。更灵活的是动态值。我经常需要测试带签名或者时间戳的接口Bruno 支持在请求前脚本里用 JavaScript 生成动态数据。比如说你要往 Header 里塞一个当前时间戳可以写const timestamp Math.floor(Date.now() / 1000); bru.setVar(timestamp, timestamp.toString());然后在 Header 里写X-Timestamp: {{timestamp}}发送请求时它就会自动替换成实时生成的值。这在做登录签名、防重放测试时非常实用比在 Postman 里依赖动态变量模板更灵活。3.4 用脚本提取返回值、写断言自动化测试的基础操作调试接口只是基础真正让这个轻量工具变“香”的是脚本能力。以前在 Postman 里写pm.test、pm.environment.set现在到 Bruno 里换成了bru对象思路是差不多的。最常见的场景登录接口会返回一个 token后续接口都需要带上。所以我要在登录请求的脚本里把 token 提取出来存成变量。在 Bruno 的 Script 区域写const body bru.getResBody(); if (body.code ! 0) { throw new Error(登录失败业务码异常 body.code); } bru.setVar(token, body.data.token);请求发送后token这个变量就被写进了当前环境。后续创建新请求时在 Headers 的 Authorization 字段里填Bearer {{token}}就能直接使用。我实测这种写法在调试“登录后操作”这类流程接口时特别省事不用每次手动从响应里复制粘贴 token也不用去“全局变量”里翻来翻去。除了提取变量脚本里更常用的操作是数据校验。比如我想验证“创建订单”接口是否真的成功可以这么写const body bru.getResBody(); if (body.code ! 0 || body.data.orderId undefined) { throw new Error(创建订单失败 JSON.stringify(body)); } const expectedStatus 201; if (bru.getResStatus() ! expectedStatus) { throw new Error(HTTP 状态码不符期望 expectedStatus); }注意一点Bruno 的脚本 API 在不同版本之间有细微差异如果某个方法报错别硬背直接看脚本编辑器旁边的 API 提示以你当前版本的文档为准。但总的编程体验很接近它用的是原生 JavaScript写起来没有额外的 DSL 学习负担。3.5 团队协作用 Git 管理接口文档和测试用例个人用户把 Bruno 当成“轻量 Postman”用团队用户则应该把它当成“接口资产仓库”来用。我的习惯是把集合目录直接放进项目的 Git 仓库最好和代码放一起。具体操作很简单。假设你的项目根目录是my-api-project里面建一个docs/api目录把 Bruno 的集合目录指定到这里。然后git init git add docs/api git commit -m init api collection团队其他成员 clone 代码后打开 Bruno选择 Open Collection指向同一个目录就能看到所有人共享的接口集合。同事新增了一个接口提交后你 pull 一下接口列表自动出现在你的本地同事改了某个接口的字段你 review 一下提交记录就能看到。整个过程是纯本地文件 Git 标准操作不存在“第三方云服务器”这个中间环节。特别推荐把接口文件纳入 Code Review 流程。比如前端和后端约好了接口规范后端把 .bru 文件提交上来前端在 MR 里就能看到请求参数和响应示例有问题直接评论指出比口头约定或者翻聊天记录靠谱太多了。我经历过一次接口字段名大小写出问题线上联调时才暴露后来把接口定义纳入仓库评审这种低级问题基本就绝迹了。4. 常见问题与排查实录4.1 从 Postman 迁移集合导入和兼容性处理很多人第一反应是问“我在 Postman 里的几十个接口怎么搬过来”。Bruno 官方支持直接导入 Postman 集合。操作路径是Collection 菜单里选 Import然后选择从 Postman 导出的.json文件Postman 侧是 Collection 右键 Export 生成的文件。但我要提前泼一盆冷水自动导入不是万能的。Postman 集合里的测试脚本、数据变量、环境配置这些“附加内容”导入时可能丢失或需要手工调整。最稳妥的迁移路径是这样的先在 Postman 里把每个环境变量导出来或者截图留存。导出所有集合的 JSON 文件。在 Bruno 里导入主要请求定义。逐个检查关键请求的 URL、Headers、Body确认无误。手动补写脚本和变量。如果是超大项目不建议一次性全部迁移。我通常先挑一个业务模块的接口做试运行用几天确认体验和功能都能覆盖需求再把其他模块逐步搬过来。这样风险小也不会在切换初期影响日常开发。4.2 HTTPS 自签名证书和局域网接口调试内部联调时经常遇到自签名证书的情况尤其是访问测试环境、本地网关或摄像头之类设备的 HTTPS 接口时证书校验过不去请求直接报错。Bruno 的设置里提供了一个开关可以关闭 TLS 证书校验路径是 Settings → TLS 或类似位置勾选“Reject Unauthorized”相关的开关并关闭即可。这个开关对测试环境非常管用省去了一堆证书导入的折腾。不过我还是要提醒一句关闭证书校验只用于本地开发和测试环境别在生产环境长期打开。如果你需要针对某个特定证书信任更好的做法是导出该环境的 CA 证书配置到系统信任链里这样 Bruno 也能正常访问同时又不会全局放松校验。4.3 把接口自动化测试跑进持续集成CLI 是硬需求Bruno 除了图形界面还有一个官方 CLI 工具能让你在命令行跑集合里写好的脚本和断言这是把接口自动化接入流水线的关键一步。安装方式是通过 npmnpm install -g usebruno/cli然后在集合目录下执行bru run --env prod --reporter-junit --output reports/junit.xml这个命令会把整个集合里的请求都跑一遍脚本里的断言会作为测试用例执行最终生成 JUnit 格式的测试报告。我给团队配过一个简单的流水线每次代码合并时流水线触发bru run拉取测试环境的接口跑回归测试如果某个接口返回异常或者断言失败流水线直接标红开发立刻收到通知。这个体系搭建起来之后接口层面的回归成本低了很多改动业务代码时不用再担心“是不是把接口搞挂了”而不敢上线。注意一点CLI 执行时的环境变量和图形界面是共享集合目录里的配置的所以你要在本地先选好环境变量文件或者用命令行参数指定环境比如--env staging。我踩过几次坑明明本机图形界面跑得好好的流水线上却全失败最后发现是测试机上没有配置对应的环境变量文件。4.4 几个容易踩的小坑给你提前排雷第一个坑是变量不解析。请求里明明写了{{token}}发送后却原样发出去了。大多数情况下是因为右上角没有选中正确的环境或者变量只存在于某一个环境里。处理方式是先确认环境选择下拉框再打开 Environment 面板检查变量名是否一致。Bruno 的变量是区分大小写的Token和token是两个东西。第二个坑是脚本报错但请求不中断。Bruno 的脚本里如果抛了异常请求在测试层面会标记失败但 HTTP 请求本身是发出去的。这点和“前置脚本”不一样前置脚本的异常通常会导致请求不发送。所以写测试断言时不要把“请求是否成功”和“断言是否通过”混在一起要看清楚执行结果里的 Tests 输出。第三个坑是并发和异步。有些接口是异步执行的比如你提交一个任务立刻返回 200 和 taskId但真正的处理结果是几秒后才在另一个接口里查询到。把这类接口写成断言时别对着第一次响应校验业务状态需要写一个轮询逻辑或者直接跳过这一步交给上层系统做处理。第四个坑是 Git 冲突。因为接口文件是纯文本两个人同时改同一个 .bru 文件确实会产生冲突解决办法和代码冲突一样手动合并或者先 pull 再改。我的习惯是一个集合尽量由一个人或一个小组主导避免多人同时大改同一个请求。真的需要分工就按业务模块拆成不同的 Collection。4.5 为什么它不适合某些人不吹不黑的实话轻量工具也意味着它主动放弃了一些东西。如果你的团队非常依赖 postman“分享链接让别人直接调接口”这种云端功能Bruno 的本地 Git 模式会觉得繁琐如果你大量使用集成好的 API 文档生成、在线 Mock、自动化测试编排Bruno 默认不自带这些你得自己搭或者换方案如果你完全不熟悉 Git那团队协作的学习成本会比 Postman 的图形化协作高一些。但换个角度看这些“不提供”的模块恰好是体积能控制在 10MB、启动又快又纯粹的原因。工具不是越全越好关键是先想明白自己要什么。5. 说点实际使用中的体会从我个人的角度说切换到 Bruno 花了我大概三天时间第一天的确有不习惯的地方比如找不到 PM 风格的断言写法、没有账号体系带来的不安全感“数据真的都存在本地了吗”。但用了一周之后我就彻底回不到 Postman 了。最直观的变化是我的工作区里多了一个能被 Git 管理的接口目录日常调试打开即用不再看到一个永远转圈圈的启动画面。团队协作也清爽了很多接口变更记录在 Git 历史里一清二楚Code Review 也变成了接口设计评审的一部分。最后再分享一个小技巧因为 .bru 是纯文本格式你完全可以不用图形界面来管理接口。我有时候会用 VSCode 直接编辑接口文件改完 URL 或者 Headers再回到 Bruno 刷新集合就能生效。这种方式特别适合批量修改几十个请求的场景比在界面上一个一个点效率高太多。你也不妨试试这种“文件即接口”的工作流也许会发现轻量工具带来的不仅是速度还有对整个接口管理方式的一次重新思考。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →