三个工具不在同一层级
| 工具 | 集合存储 | 协作 | 适合 |
|---|---|---|---|
| Apifox | 云端 + 本地 | 强,文档 / Mock / 测试一体 | 团队、要接口文档与自动化 |
| Bruno | 纯本地 .bru 文本 | 靠 git | 不想上云、要版本化与 diff |
| curl / httpie | 命令即文档 | 脚本共享 | CI、复现问题、快速试探 |
Apifox 把接口定义、Mock、自动化测试、文档串在一起,团队协作确实省事,但集合默认同步到云端,内网接口地址和真实 token 别随手上传。Bruno 最打动我的一点是集合就是目录里一堆 .bru 纯文本,能进 git、能 code review、能 diff,没有账号和云同步,缺点是生态和 Mock 能力弱一些。Postman 现在太重又强推登录,Insomnia 介于两者之间。
Bruno 落地配置
新建 collection 时选一个仓库内目录,环境变量放 environments/ 下,用 {{baseUrl}} 引用,dev / staging / prod 一键切换,切换时别把生产 token 提交进仓库。前置脚本用 JS 算签名或时间戳,比在 GUI 里手填 HMAC 稳得多。从 Postman 导出的集合能直接 import,迁移成本很低,把整个目录提交后同事 clone 打开即用。
// Pre Request:给需要签名的接口补时间戳与 nonce
const ts = Date.now().toString();
bru.setVar("ts", ts);
bru.setVar("nonce", Math.random().toString(36).slice(2));
curl 才是最后的真相
不管 GUI 里怎么点,复现问题落到一条 curl 最靠谱,也方便贴进 issue 让别人照着跑。下面几条覆盖日常九成场景:
curl -i -X POST http://localhost:8080/api/items
-H "Content-Type: application/json"
-H "Authorization: Bearer $TOKEN"
-d '{"name":"demo","count":2}'
curl -v http://localhost:8080/health
curl -o /dev/null -s -w "status=%{http_code} time=%{time_total}s
" http://localhost:8080/api
curl -F "file=@./a.png" http://localhost:8080/upload
curl -c cookies.txt -b cookies.txt http://localhost:8080/profile
curl --data-urlencode "q=中文 关键词" -G http://localhost:8080/search
curl -k https://self-signed.local/ping
curl -s http://localhost:8080/api | jq '.data | length'
-w 那行适合做健康检查脚本,把状态码和耗时直接打出来;-F 走 multipart 上传;-c / -b 成对使用维持会话;--data-urlencode 加 -G 才是正确的 GET 查询串写法,别手工拼中文。
Windows 与网络踩坑
- 引号:cmd 不认单引号,JSON 里的双引号要转义,最省事是直接用 Git Bash 或 PowerShell 的 here-string,别在 cmd 里硬拼。
- 自签证书:-k 只用于本地测试,别写进生产脚本;正确做法是把内部 CA 加进信任链,用 --cacert 指定。
- localhost:某些服务只监听 IPv4,而 localhost 解析到 ::1 导致连接被拒,改 127.0.0.1 立刻好。
- 代理:系统代理会把本地请求转走,用 NO_PROXY=localhost,127.0.0.1 或 curl --noproxy 排除。
- 敏感信息:Apifox 云端环境和 Bruno 的 .env 都要确认 .gitignore 覆盖,token 提交上去等于公开。