Bruno 开源 API 客户端(Bru 语言 · 离线优先 · Git 协作):以官方俄语 README 为纲的全面技术解读

发布时间:2026/9/9 20:00:19

Bruno 开源 API 客户端(Bru 语言 · 离线优先 · Git 协作):以官方俄语 README 为纲的全面技术解读 Bruno 开源 API 客户端Bru 语言 · 离线优先 · Git 协作以官方俄语 README 为纲的全面技术解读【免费下载链接】brunoOpensource IDE For Exploring and Testing APIs (lightweight alternative to Postman/Insomnia)项目地址: https://gitcode.com/GitHub_Trending/br/bruno本文以仓库中官方文档 docs/readme/readme_ru.mdBruno 项目官方俄语介绍页为骨架结合本仓库的源码、.bru格式范例与测试夹具展开成文。核心覆盖Bruno 是什么、为何离线优先、集合以纯文本 Bru 语言落盘于文件系统、Git/任意版本控制协作、跨平台运行以及安装、CLI 与 Docker 的实战路径。读完本文你可以掌握 Bruno 的定位与数据模型能够用一个git clone或一句bru run在自己的机器上跑通 API 测试。一、项目定位面向探索与测试 API 的开源 IDEBruno 是一款开箱即用、面向探索与测试 API 的开源 IDE项目主页与各语言 README 均以此为核心定位。仓库根目录 readme.md 中将其表述为Opensource IDE for exploring and testing APIs而关联文档 docs/readme/readme_ru.md 进一步说明Bruno 是一个新颖而创新的 API 客户端其目标是变革 Postman 及类似工具所代表的既有格局。需要注意这句话是项目自身的愿景陈述而非一个已被第三方验证的结论因此本文不将其作为性能或市场地位的事实引用仅作为项目的自我定位呈现。从仓库结构可以确认该定位落到了实处——仓库是典型的多包monorepo工程桌面应用本体位于 packages/bruno-appElectron 壳层位于 packages/bruno-electronCLI 位于 packages/bruno-cli。俄语 README 明确指出桌面版由Next.js React Electron构建并支持本地集合локальные коллекции这与仓库中的技术选型一一对应界面框架Next.js React见 packages/bruno-app其package.json中声明了相关依赖桌面封装Electron见 packages/bruno-electron由src/index.js作为进程入口样式Tailwind见 packages/bruno-app/tailwind.config.js编辑器CodeMirror编辑器相关代码集中在packages/bruno-app/src/components/codemirror附近状态管理Redux大量packages/bruno-app/src/providers与selectors基于 Redux 组织文件系统监听chokidar详见 packages/bruno-docs 与bruno-electron中对工作区文件的观察逻辑需要说明此处的技术栈清单综合了 docs/contributing/contributing_ru.md 的明确声明与仓库源码结构读者可依据上述路径在源码中逐一印证。二、核心数据模型集合即文件系统上的一个文件夹这是 Bruno 与 Postman 类工具最本质的差异也是俄语 README 中反复强调的基石Bruno хранит ваши коллекции непосредственно в папке в вашей файловой системе.Bruno 将你的集合直接存放在文件系统的一个文件夹里。换句话说没有私有的云端数据库、没有隐藏的服务端存储一个集合就是一个目录目录里是若干用 Bru 语言编写的文本文件。这种集合即目录的模型带来了三个直接后果均可在源码中验证文本可读、可 diff。集合内容由纯文本标记语言 Bru 写成详见下一节因此天然适合版本控制。无供应商锁定。你随时可以复制、归档、迁移整个集合目录。协作基于通用工具。Git 或任意你喜欢的版本控制系统就是协作工具详见第四节。在仓库的测试夹具里可以直观看到集合 目录 .bru文件的布局。以 packages/bruno-cli/tests/runner/fixtures/collection-json-from-pathname/collection/collection.bru 为根集合文件同目录下嵌套folder_1、folder_2等子文件夹子文件夹内各有自己的folder.bru再往下就是一个个请求.bru文件——树状结构与磁盘目录结构一一对应。三、Bru一种用于描述 API 请求的纯文本标记语言俄语 README 明确指出为了保存 API 请求的信息Bruno 使用一种纯文本标记语言 Bru。这一设计是本项目最值得深挖的实现细节仓库中有完整独立的解析包 packages/bruno-lang 与其语言规范目录 packages/bruno-lang/v2/src。3.1 一个真实的请求文件长什么样以官方示例 packages/bruno-lang/example/request.bru 为例一个典型的 HTTP 请求.bru文件包含type http-request name Send Bulk SMS method GET url https://api.textlocal.in/bulk_json?apiKeysecretnumbers919988776655messagehellosender600010 body-mode json seq 1 params 1 apiKey secret 1 numbers 998877665 1 message hello /params headers 1 content-type application/json 1 accept-language en-US,en;q0.9,hi;q0.8 0 transaction-id {{transactionId}} /headers body(typejson) { apikey: secret, ... } /body可以看到 Bru 是分段式block 风格的键值文本顶部是请求的标量属性type如http-request、name、method、url、body-mode、seq执行序号等params、headers等用段名 内容 /段名的成对标记包裹段内每行以启用标志 键 值的形式书写其中数字1/0表示该参数或请求头是否启用即 GUI 中的勾选框状态headers的值支持{{变量}}插值语法示例中transaction-id使用了{{transactionId}}变量可来自环境、集合变量等body(typejson)支持按类型区分的请求体示例中同时演示了json与graphql两种 bodyscript段书写请求前后脚本示例中的onRequest(request)会在请求发送前改写 bodyonResponse(request, response)则可用expect(response.status).to.equal(200)做断言测试断言语义由 packages/bruno-js 的脚本运行环境提供。3.2 Bru 不是 JSON而是为 diff 而生的文本之所以用 Bru 而非 JSON/XML可从解析器实现反推其设计意图bru 文本与 JSON 的双向转换逻辑位于 packages/bruno-lang/v2/src/bruToJson.js 与 packages/bruno-lang/v2/src/jsonToBru.js而包的统一出口 packages/bruno-lang/src/index.js 将bruToJsonV2、jsonToBruV2、环境变量互转、集合文件互转等能力集中导出。文本化 双向往返转换round-trip意味着修改一个.bru文件只是几行文本变更git diff 清晰可读、可审查。这正好回应了 README用 git 协作的前提——协作的前提是变更可读。3.3 集合级与文件夹级 Bru 文件集合目录里不止请求.bru还有集合级与文件夹级的配置.bru。以测试集合 packages/bruno-tests/collection/collection.bru 为例headers { check: again token: {{collection_pre_var_token}} collection-header: collection-header-value } auth { mode: bearer } auth:bearer { token: {{bearer_auth_token}} } vars:pre-request { collection_pre_var: collection_pre_var_value collection_pre_var_token: {{request_pre_var_token}} collection-var: collection-var-value number coll_num: 100 boolean coll_bool: false object coll_obj: {scope:collection} } script:pre-request { const shouldTestCollectionScripts bru.getVar(should-test-collection-scripts); ... } tests { ... } docs { # bruno-testbench This is a test collection ... }由此可看出集合级 Bru 支持的关键机制headers/auth继承集合定义默认请求头与认证此处为bearer模式子请求无需重复填写即可继承vars:pre-request集合变量支持{{变量}}互相引用如collection_pre_var_token: {{request_pre_var_token}}还可用number、boolean、object等类型注解强制变量类型多行...用于对象/多行字符串script:pre-request集合级预请求脚本可调用bru.getVar / bru.setVar读写变量tests集合级断言脚本上述样例中test(collection level script, ...)使用expect(...)断言docsMarkdown 风格的集合文档说明。文件夹级.bru结构与集合级类似实现同理从而支持集合 → 文件夹 → 请求三级的默认值、脚本与变量继承。四、协作方式Git 与任意版本控制系统这是俄语 README 除离线外的第二个核心卖点Для совместной работы над коллекциями API можно использовать git или любой другой контроль версий по вашему выбору.可以用 git 或你选定的任意版本控制系统在 API 集合上进行协作。由于集合只是磁盘上的文本目录你的协作流程与协作普通代码别无二致克隆或分享集合目录仓库内 packages/bruno-tests、tests 下大量以目录形式组织的测试集合即是这种形态的实例成员各自在本地修改.bru文件通过 PR / MR 走常规代码评审合并后其他人pull即获得最新的请求、环境与脚本。没有集中式服务器、没有多人同时编辑同一份云文档的锁冲突——一切由你既有的 Git 工作流接管。仓库中的 Git 集成测试如 tests/workspace/git-backed-collections也印证了git 作为一等公民的开发方向。五、离线优先数据留在你的设备上俄语 README 毫不含糊地声明了产品的隐私立场Bruno работает только в автономном режиме. Добавление облачной синхронизации в Bruno не планируется.Bruno 仅在离线模式下工作且未来也不计划加入云同步。结合上文可以理解其中的因果链因为集合以明文 Bru 落在本地文件系统、协作走 Git云端同步既非必要也与其数据主权理念相悖。Bruno 团队珍视用户数据隐私认为数据应当留在你自己的设备上长期愿景与路线图详见官方 Discussion俄语页中给出的外部链接均为跳转至项目官方的在线讨论与文档站点这里不再展开列出外部 URL。从工程实现看离线优先体现在两个层面桌面端 packages/bruno-electron 通过 chokidar 等文件监听能力直接读取/观察本地集合目录应用本身不需要后端服务即可完成集合的增删改查命令行的运行与测试亦完全在本地执行见第六节天然适配 CI/CD 与无网络环境。需要客观说明的一点README 所声明的无云同步是对产品当前形态与规划的陈述若要了解最新状态例如是否存在任何在线增值服务应以官方站点与实际发布版本为准本文不进行任何额外推断。六、安装、CLI 与 Docker三种运行形态英文主 README readme.md 对如何获得、运行 Bruno 给出了比俄语页更完整的操作清单以下结合两者整理。它们与本仓库的关系是仓库是这些发布物的源码来源例如 CLI 的实现位于 packages/bruno-cli/src其index.js、commands目录分别承载命令注册与参数解析。6.1 桌面客户端安装Mac / Windows / Linux官方提供各主流平台二进制下载同时支持多种包管理器安装# Mac 上使用 Homebrew brew install bruno # Windows 上使用 Chocolatey choco install bruno # Windows 上使用 Scoop scoop bucket add extras scoop install bruno # Windows 上使用 winget winget install Bruno.Bruno # Linux 上使用 Snap snap install bruno # Linux 上使用 Flatpak flatpak install com.usebruno.Bruno # Arch Linux 上使用 AUR yay -S bruno # Linux 上使用 Apt通过官方 Debian 仓库 sudo mkdir -p /etc/apt/keyrings sudo apt update sudo apt install gpg curl curl -fsSL https://keyserver.ubuntu.com/pks/lookup?opgetsearch0x9FA6017ECABE0266 \ | gpg --dearmor \ | sudo tee /etc/apt/keyrings/bruno.gpg /dev/null sudo chmod 644 /etc/apt/keyrings/bruno.gpg echo deb [archamd64 signed-by/etc/apt/keyrings/bruno.gpg] http://debian.usebruno.com/ bruno stable \ | sudo tee /etc/apt/sources.list.d/bruno.list sudo apt update sudo apt install bruno上述命令中的包源地址来自上游发布渠道如需完整、最新的发行渠道请查阅官方下载页。6.2 Bruno CLI命令行运行集合CLI 让你摆脱 GUI 也能运行集合尤其适合自动化测试与 CI/CD。通过 npm 全局安装后进入集合目录即可运行npm install -g usebruno/cli # 运行集合中的全部请求 bru run # 运行单个请求 bru run request.bru # 针对指定环境运行某个文件夹 bru run folder --env LocalCLI 的代码结构位于 packages/bruno-cli/src/commands命令解析与执行入口与 packages/bruno-cli/src/runner集合运行器运行结果的报告能力由 packages/bruno-cli/src/reporters 提供。bru run的所有细节环境变量、超时、报告格式等可参考其官方 CLI 文档也可以直接阅读 CLI 包内自带的使用说明 packages/bruno-cli/readme.md 与变更日志 packages/bruno-cli/changelog.md。6.3 用 Docker 运行 CLI免装 Node若不想在宿主机安装 Node.js/npm可使用官方 CLI 容器镜像在 CI/CD 或本地直接跑集合docker pull usebruno/cli:latest # 将当前目录挂载进容器并运行集合 docker run -v $(pwd):/bruno usebruno/cli run主 README 中说明镜像在每次 CLI 发布时同步推送到 Docker Hub 与 GitHub Container Registry并提供alpine、debian变体、覆盖linux/amd64与linux/arm64架构。仓库内可查看镜像相关构建材料 packages/bruno-cli/docker 及冒烟测试脚本smoke-test.sh实际可用的镜像 tag 组合请以发布页为准。七、从仓库再往前走一步如何亲自动手直接体验桌面端下载对应平台的 Bruno 安装包选择一个本地目录作为集合根目录新建请求、保存后立刻在该目录中查看生成的.bru文本文件。零 GUI 验证 Bru 格式对照 packages/bruno-lang/example/request.bru 手工编写一个http-request再用bru run运行验证能直观理解文本即集合。阅读解析器加深理解bru 文本 ⇄ JSON 双向转换实现集中在 packages/bruno-lang/v2/src其对应测试如 packages/bruno-lang/v2/tests/bruToJson.spec.js以大量.bru与.jsonfixture 验证转换正确性是学习 Bru 语法边界注解、嵌套、多行值、collection/folder 级块的最佳教材。探索脚本能力请求脚本、断言与内置库的运行语义在 packages/bruno-js尤其sandbox、runtime子目录中实现测试集合 packages/bruno-tests/collection 展示了从简单断言到认证、Cookie、请求链等复杂场景的用法。八、关于本地化文档与后续入口俄语 README 是官方多语言 README 家族的一员仓库 docs/readme 目录收录了简体中文、正体中文、日文、韩文、德文、法文、阿拉伯文等 20 余种语言的版本其本身内容与英文主 README readme.md 保持一致。若想继续深入仓库内还有参与贡献指南俄语版docs/contributing/contributing_ru.md发布流程说明publishing.md多语言版本见 docs/publishing代码与工程规范CODING_STANDARDS.md、governance.md许可证license.mdMIT说明本文除基于俄语 README 与仓库源码外还参考了仓库根目录英文 readme.md 的安装/CLI/Docker 操作细节以保证命令的完整与准确其中链接指向的在线 Discussion、官方文档站点等属于仓库外资源本文不再输出相关外部 URL具体请以官方渠道为准。【免费下载链接】brunoOpensource IDE For Exploring and Testing APIs (lightweight alternative to Postman/Insomnia)项目地址: https://gitcode.com/GitHub_Trending/br/bruno创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/9 20:00:19

Windows批量给文件名加后缀:cmd、PowerShell与批处理脚本实战

Windows 批量给文件名加后缀,是日常办公和开发运维里出现频率很高的操作:导出的日志要追加日期,配置文件要追加环境标识,备份文件要追加 .bak,图片素材要追加批次号。手动按 F2 一个个改,少说几十个文件&am…

2026/9/9 20:00:19

扩增子分析全流程解析:从16S/ITS到二三代测序与可视化

引言这年头做微生物组研究,离了扩增子测序几乎是寸步难行。16S和ITS这两个经典的标记基因,在过去十几年里撑起了肠道、土壤、水体、植物根际等无数微生态研究方向的基本盘。但恰恰是这个“基本盘”,这几年正在经历一轮非常明显的技术换挡&…

2026/9/9 20:00:19

PyTorch Hook机制实战:可视化神经网络中间层特征图

1. 为什么要可视化神经网络的中间层输出很多初学者在跑 PyTorch 模型时,往往只关注最后的 loss 和 accuracy,对网络内部发生了什么基本“两眼一抹黑”。模型训练好了、测试准确率也挺高,但一旦效果不好,就不知道问题出在哪里&…

2026/9/10 0:36:01

PySide6开发桌面天气应用全攻略:从API对接、界面设计到打包部署

“桌面版天气预报应用”这个名字听起来简单,但真正动手做的时候,你会发现它几乎能逼你把桌面开发、网络请求、数据解析、状态管理、异常处理、打包分发这条路完整走一遍。我最初想做个桌面天气应用,纯粹是因为受够了手机天气推送的过度设计—…

2026/9/10 0:36:01

基于Simulink的光储联合系统虚拟同步机控制与削峰填谷仿真

我们直接进入正题。光伏电站并网,遇到的两个老大难问题:一是并网后系统惯性低,电网一有波动站里就跟着抖;二是发电曲线和负荷曲线对不上,中午猛发、傍晚急跌,俗称"鸭子曲线"。用储能配合虚拟同步…

2026/9/10 0:36:01

C# WinForms医院挂号管理系统开发实战解析

简介:这是一份基于C# WinForm开发的医院挂号管理系统项目,采用C/S架构与MVC分层设计,覆盖用户管理、科室管理、医生管理以及门急诊挂号、挂号查询、修改口令、挂号单打印和帮助文档等核心模块,适合正在学习C#桌面应用或医疗管理系…

2026/9/10 0:36:01

用Triton手写21个Kernel,Qwen3.5推理提速至223 tokens/s

我花了两周时间,用 Triton 手写了 21 个 kernel,把 Qwen3.5-0.8B 的完整推理链路从 PyTorch 的自动调度里一层层剥出来,最终在单张消费级显卡上把生成速度压到了 223 tokens/s。整个过程远没有标题看起来那么光鲜,中途遇到过 NaN …

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码