HTTP Studio
一个“配置随代码走”的 VS Code HTTP 客户端。环境、目录和请求都保存在项目里的 .http/conf.json,和代码一起提交、一起 Code Review。
- 永久免费,无需登录,离线可用,支持 Remote / WSL / SSH
- 图形化请求编辑器,支持 Params、Headers、Body、Auth、Tests
- 多环境:每个环境配置协议、域名或 IP、端口、上下文路径,在请求面板工具栏或状态栏一键切换
- 目录层级不限,支持拖拽排序;目录和集合可设置公共请求头与认证,下级自动继承
- 不写脚本也能做请求链和断言:从响应提取 token 等变量供后续请求使用;“预执行”可以让请求在发送前先跑登录等已有请求,成功后再发送
- 一键生成
.http/README.md 配置说明,交给 AI 编程助手根据代码里的 Controller 自动生成接口配置
- 一键导入 Postman、Thunder Client、OpenAPI / Swagger、
.http 文件和 cURL
- 可以运行整个目录,也可以用 CLI 在 CI 中复用同一份配置
快速开始
- 打开项目,点击活动栏中的 HTTP Studio 图标
- 点击“初始化”,插件会生成
.http/conf.json(带示例)和 .http/.gitignore
- 在请求面板顶部的环境下拉菜单中选择“管理环境…”编辑环境;在下方的请求树中新建目录和请求(右键菜单或工具栏按钮)
- 在请求编辑器里按
Cmd/Ctrl+Enter 发送,按 Cmd/Ctrl+S 保存
想让 AI 根据代码生成接口配置时,在侧栏“更多”菜单(未初始化时为欢迎页按钮)点击“初始化 AI 配置说明”,插件会在 .http/README.md 写入配置文件的结构与编写规则,再让 AI 读这份说明并扫描 Controller 即可。
如果项目里已经有 .http/conf.json,打开工作区时插件会自动加载。执行 git pull、切换分支或手动修改文件后,界面会实时刷新。
文件说明
| 文件 |
是否提交 |
用途 |
.http/conf.json |
是 |
环境、全局变量、集合与目录设置、全部请求 |
.http/conf.local.json |
否(已自动加入 .http/.gitignore) |
密钥、个人覆盖值、请求链捕获的变量 |
.http/README.md |
是(可选) |
“初始化 AI 配置说明”生成的配置编写说明,供 AI 编程助手阅读 |
conf.json 采用确定性格式:字段顺序固定,省略默认值,JSON 请求体以原生 JSON 存储,节点使用稳定 id。加载后再保存不会产生任何 diff,在 PR 里可以直接看出接口改了什么。手工编辑时有 JSON Schema 补全和校验。
{
"version": 1,
"environments": [
{ "id": "k3j9x0a1", "name": "测试", "protocol": "https", "host": "test.example.com", "port": 8443, "basePath": "/api",
"variables": [{ "key": "token", "value": "", "secret": true }] },
{ "id": "p8d2m4q7", "name": "生产", "protocol": "https", "host": "api.example.com", "basePath": "/api",
"color": "red", "confirmSend": true }
],
"items": [
{ "id": "f1a2b3c4", "type": "folder", "name": "用户", "items": [
{ "id": "r5d6e7f8", "type": "request", "name": "用户详情", "method": "GET", "url": "/users/{{userId}}",
"auth": { "type": "bearer", "token": "{{token}}" },
"assertions": [{ "source": "status", "operator": "eq", "expected": "200" }] }
] }
]
}
变量
- 语法为
{{name}}。相对路径会自动拼接当前环境的 {{baseUrl}},即 protocol://host:port/basePath
- 优先级从高到低:本地环境值 > 共享环境变量 > 本地全局值 > 共享全局变量 > 内置变量(
baseUrl、host、port、basePath、protocol)
- 动态变量:
{{$uuid}}、{{$timestamp}}、{{$isoTimestamp}}、{{$datetime "YYYY-MM-DD"}}、{{$randomInt 1 100}}、{{$processEnv NAME}}(仅在受信任的工作区可用)
- 标记为 secret 的变量,真实值只保存在
conf.local.json
- 存在未解析的变量时会拦截发送,不会把
{{x}} 原样发出去
生产环境保护
在环境上设置 confirmSend: true 后,状态栏会显示警示色,发送 POST、PUT、PATCH、DELETE 等写操作前会弹出二次确认。
CLI
node dist/cli.js run --env 测试 --folder 用户 --reporter text
全部通过时退出码为 0,有失败为 1,配置或参数错误为 2。
开发
npm install
npm run build # 构建扩展、CLI 和 Webview
npm run typecheck # 宿主 + Webview 类型检查
npm test # vitest 单元测试(core、三方合并等)
npm run test:e2e # 真实 VS Code 集成测试(首次运行会下载 VS Code 到 .vscode-test/)
npm run check:l10n # 检查中文翻译是否齐全(加 -- --prune 删除无引用条目)
npm run vsix # 生产构建并打包到 release/<名称>-<版本>.vsix(发布流程见 CLAUDE.md)
npm run check:webview # 无头 Chrome 驱动 Webview 预览夹具做交互检查
npm run icon # 把 media/logo.svg 渲染为 media/icon.png(仅 macOS,需要 Chrome)
npm run vsix # 打包为 .vsix
集成测试可以用环境变量 E2E_SUITES 和 E2E_GREP 只跑一部分。
图标
| 文件 |
用途 |
media/logo.svg → media/icon.png |
产品彩色图标(应用市场):圆角六边形,外圈 6 段渐变取自 HTTP 方法配色,中间是等宽笔画画出的渐变文字 Http(与 file-studio-plugin 的 File 图标同一画法,不依赖字体),文字取外圈的冷色段:紫 → 蓝 → 青 → 绿 |
media/icon.svg |
活动栏图标:六边形内一个字母 H,单色 currentColor |
media/icon-light.svg、media/icon-dark.svg |
请求编辑器等面板的标签页图标(亮色/暗色主题) |
media/methods/*.svg |
请求树中的方法彩色徽标 |
在 VS Code 中按 F5,会用 sample-workspace/ 启动扩展调试。设计细节见 docs/DESIGN.md。
Webview 可以脱离 VS Code 在浏览器中预览:先运行 node webview/dev/build.mjs,再打开 webview/dev/index.html?view=request&theme=dark&locale=zh-cn。view 可选 request、environments、folder、runner,theme 可选 light、dark、hc。
开发进度(2026-10-30 更新)
当前状态
所有计划内的功能都已完成,并通过了以下检查:
| 检查 |
结果 |
npm run typecheck |
宿主和 Webview 都没有类型错误 |
npm test |
12 个测试文件,294 个用例通过,1 个跳过(Go 代码生成的语法校验,本机没有装 go) |
npm run test:e2e |
在真实 VS Code 1.144 中运行:示例工作区 69 项中 67 项通过、空文件夹 6 项通过。失败的 2 项是侧栏用例:sample-workspace/.http/conf.json 的 Admin 目录里 reqpatch 被移到了 requpdat 之前(疑似手动拖拽测试留下的),与用例期望的顺序不符 |
npm run check:webview |
297 项界面交互检查通过(编辑器 138 项、侧栏 159 项),深浅两套主题各跑一遍 |
npm run check:l10n |
96 条运行时字符串、33 个贡献点 key、22 个命令,中文翻译无缺失,命令注册与菜单引用一致 |
| CLI 实测 |
对 httpbin.org 运行示例集合的 20 个请求,19 个通过;剩下 1 个引用了没有本地值的 secret 变量,按设计被拦截 |
集成测试覆盖了:扩展激活、命令注册、配置加载与保存(加载后再保存零 diff)、热加载、非法 JSON 和 Git 冲突标记下的只读保护、打开请求后 Webview 真正运行、对本地服务的真实请求与变量捕获、初始化、编辑器同步消息、侧栏的状态推送 / 切换环境 / 管理环境 / 拖拽移动 / 定位,以及 Webview 运行期无脚本错误。
已完成
| 模块 |
文件 |
说明 |
| 调研与设计 |
docs/DESIGN.md |
竞品调研结论、架构、存储、变量、界面和安全设计 |
| 共享契约 |
src/shared/model.ts、src/shared/messages.ts |
数据模型,以及 Webview 与宿主之间的通信协议 |
| 核心逻辑 |
src/core/* |
配置序列化、变量解析、HTTP 执行器、断言与捕获、运行器、cURL、代码生成、导入器 |
| CLI |
src/cli.ts |
在 CI 中复用 conf.json |
| 扩展宿主 |
src/extension.ts、src/store、src/views、src/panels、src/commands、src/util |
经过两轮审查;窗口重载后恢复面板(src/panels/serializers.ts);侧栏宿主为 src/views/sidebarView.ts |
| Webview |
webview/src/* |
请求、环境、目录设置、运行器 4 个编辑区视图;键名列和值列都支持 {{var}} 高亮与补全;地址栏以只读灰字显示当前环境前缀(参照 Apipost);渲染出错时显示错误页并上报输出面板 |
| 请求侧栏 |
webview/src/sidebar/*、src/views/sidebarView.ts |
活动栏只保留“请求”一个视图(已移除环境、历史视图及历史记录功能)。顶部工具栏样式参照 file-studio-plugin:环境下拉(最后一项“管理环境…”)+ 新建请求 / 新建目录 / 全部折叠 / 更多;下方请求树支持右键菜单、拖拽、键盘导航、状态页。独立 bundle,生产构建约 246KB,不含 CodeMirror |
| 编辑器同步 |
environments/select、environments/active、environments/local、folder/context 等消息 |
环境编辑器打开时切换选中项、刷新 Active 标记;请求捕获的新 token 不会被保存覆盖(三方合并,见 src/util/localMerge.ts) |
| 预执行请求 |
src/core/runner.ts(runRequest / allCaptured / expandPreRequests)、webview/src/views/request/PreRequestsEditor.tsx、PreResults.tsx |
请求的“预执行”标签页:按顺序先执行集合中已有的请求,状态码等于期望值(默认 200)且其自身断言全部通过才发送本请求;捕获值立即可用并写入本地值;支持嵌套与循环检测;面板、运行器、CLI 行为一致;受保护环境确认时一并计入预执行请求的方法 |
| AI 配置说明 |
src/core/configGuide.ts、命令 httpStudio.generateConfigGuide |
在 .http/README.md 生成中英文(随 VS Code 语言)的 conf.json 编写说明与 Controller 映射规则;文中示例由 serializeConfig 生成并有单测校验,避免与实现脱节 |
| 测试 |
test/*.test.ts、test/e2e/、webview/dev/check.mjs |
单元测试、真实 VS Code 集成测试、Webview 交互检查 |
| 图标 |
media/ |
见上文“图标”一节 |
待办
- [ ] 确认
sample-workspace/.http/conf.json 中 Admin 目录的顺序改动是否有意为之;不是的话把 reqpatch 移回 requpdat 之后,集成测试即可全部通过
- [ ] 按 F5 手动验证:重载窗口后恢复已打开的面板(测试模式下无法覆盖真实重载);侧栏的真实鼠标拖拽
- [x] 发布第一个版本
26.10.1(2026-10-30):已打包到 release/http-workspace-client-26.10.1.vsix(.gitignore 忽略 *.vsix,安装包不进 Git)并完成首次提交
- [x] 项目更名为 HTTP Studio(2026-10-30):包名
http-studio(扩展 ID lupee.http-studio),命令、视图、设置项前缀由 httpWorkspace. 改为 httpStudio.,CLI 命令名 http-studio
- [x] 发布
26.10.2(2026-10-30):更名后的首个版本,已打包到 release/http-studio-26.10.2.vsix,旧名安装包已清理
- [x] 发布
26.10.3(2026-10-30):产品图标去掉火焰两侧的绿色、蓝色尾迹,已打包到 release/http-studio-26.10.3.vsix
- [x] 配置远程仓库并推送(2026-10-30):
origin 为 https://gitee.com/Lupeed/http-studio-plugin.git
- [ ] (可选)在
package.json 补上 repository 字段,打包时就不再需要 --allow-missing-repository
- [ ] (可选)补一个
LICENSE 文件(package.json 声明了 MIT),打包时就不再需要 --skip-license
- [ ] (可选)缩小 Webview 包:生产构建 JS 为 955KB(gzip 后 310KB),去掉
@codemirror/lang-html 可再减少约 100KB
- [ ] (可选)响应支持 HTML 预览:需要在 CSP 中放开
frame-src,并为 iframe 加 sandbox
已知限制
- VS Code 只在标签页首次可见时才恢复面板。在此之前从树中打开同一个请求会新建面板,之后再点开旧标签,旧标签会被关闭
- 环境编辑器收到
environments/local 时,被清空的“仅本地”变量会保留为空行,以免行错位
- 变量单元格的编辑器是懒挂载的,挂载后需要轻移鼠标才会出现变量悬停提示
- 侧栏宽度不到 260px 时,“新建目录”“全部折叠”按钮会收进“更多”菜单
- 侧栏拖拽用合成的 DragEvent 测试,真实鼠标拖拽和悬停自动展开需要手动验证
开发约定(继续开发前请先看)
- 发给宿主的对象上不能挂 UI 临时字段。
serializeConfig 会原样保留未知字段,写进 conf.json。表格行的 React key 应在组件内部单独维护
- 预执行请求按 id 引用:
preRequests[].requestId 指向同一 conf.json 中的请求;expectStatus 为 200 时不落盘,宿主 writePreRequests 与 Webview cleanPreRequests 必须保持同一规则。修改 conf.json 结构时同步更新 src/core/configGuide.ts 的说明(单测会校验字段覆盖与示例可加载)
request.url 不包含 query。query 统一放在 params 中。Webview 载入旧数据时会把 URL 里的 query 自动迁移到 params
- 存在未解析变量时拦截发送,错误码为
UNRESOLVED_VARIABLES。没有本地值的 secret 变量也视为未解析
- secret 变量的真实值只能存在 conf.local.json 中,conf.json 里一律写空串。导入和保存集合设置时,由宿主负责转存
- 保存本地值时做三方合并:
environments/save 带上 Webview 的基线 baseLocal,用户没改过的值以磁盘为准
- core 层(
src/core)不能依赖 vscode,因为 CLI 和单元测试都要复用它
- 新增协议消息时,宿主和 Webview 两侧都要实现,并在
test/e2e 与 webview/dev/check.mjs 中加上对应用例
- 宿主中的运行时字符串用
vscode.l10n.t('English'),中文翻译放在 l10n/bundle.l10n.zh-cn.json,改完运行 npm run check:l10n;Webview 的翻译词典在 webview/src/i18n.ts