
resterm v1.5.6
适用于 HTTP、GraphQL 和 gRPC 的终端 API 客户端。使用纯 .http 文件,可进行 diff 和版本管理,支持工作流、模拟、性能分析、追踪、OpenAPI 导入、SSH 隧道、Kubernetes 端口转发、WebSocket、SSE 以及 CLI 运行器。
Resterm
一个面向终端原生的 API 客户端和工作台,支持 REST、GraphQL、gRPC、WebSocket 和 SSE。
Resterm 是一个 API-as-code 工作台——或者用更熟悉的说法,一个 API 客户端——它围绕普通的 .http 和 .rest 文件构建,这些文件你可以进行 diff、审查和版本管理。它将交互式请求编辑与声明式工作流、断言、模拟服务器、追踪、性能分析和无头自动化相结合。所有内容都保留在你的机器上。无需账户、无需云同步、无遥测。
如果你正在寻找一个以 GUI 集合为中心的 Postman 风格客户端,Resterm 可能 不适合 你,但无论如何试试吧!
[!NOTE] Resterm 现已发布 v1!请参阅 v1.0.0 发布说明 了解新功能和破坏性变更。
截图导览
查看界面实际效果(点击展开)
工作流
追踪与时间线
性能分析器
解释
RestermScript
浅色主题
OAuth 浏览器演示(旧版 UI 设计)
为什么选择 Resterm
- 开箱即用支持 HTTP、GraphQL、gRPC、WebSocket 和 SSE。
- 自动化内置于请求文件中: 条件(
@when、@if/@elif/@else、@for-each)、多步骤工作流(@workflow/@step)、捕获、变量和断言(@capture、@var、@assert)。 - RestermScript,一种为 Resterm 构建的小型表达式语言,在你需要时还提供 JavaScript 钩子。
- Vim 风格控制,带有上下文相关的底部栏提示、可搜索的离线帮助、光标下的
K帮助、/搜索以及:w、:q、:help和:docs等命令。 - 内置认证和隧道: OAuth 2.0(客户端凭证、密码、带 PKCE 的授权码)、由你现有 CLI 支持的认证、SSH 隧道和 Kubernetes 端口转发。无需额外工具。
- CLI 运行器:
resterm run用于脚本化运行和 CI,支持 JSON 和 JUnit 输出。 - 模拟服务器 声明在它们所模拟的请求旁边,支持匹配规则、序列、调用验证和热重载。
- 跨环境的追踪、性能分析和运行对比。
- 流式转录 以及用于 WebSocket 和 SSE 的交互式控制台。
- 永不集成 AI。
快速开始
- 安装 Resterm(有关脚本、Windows 和手动安装,请参阅 安装)。 ```bash
brew install resterm
- 引导一个工作区。 ```bash
mkdir my-api && cd my-api
resterm init
resterm init 会为你生成一个小型项目,无需联网即可运行。生成的 requests.http 包含本地模拟场景以及若干相互关联的请求,涵盖断言、Bearer 认证、JSON 匹配、json-rules 和 @for-each。
- 启动它并发送你的第一个请求。 ```bash
resterm
在编辑器中按 Ctrl+Enter 即可发送高亮的请求。
还没有文件?直接运行 resterm,输入 URL 并按 Ctrl+Enter 即可。粘贴的 curl 命令同样适用。
请求文件
Resterm 请求文件使用标准 HTTP 语法,并附加 # @ 指令用于配置和自动化:```http
@setting base-url https://api.example.com/v1/
Create users
// Send this request once for each name in the list.
@for-each ["david", "tom"] as name
@when env.mode == "development"
@assert response.statusCode == 201
POST users Content-Type: application/json
{"name":"{{= name }}"}
设置会在首次请求之前应用于整个文件,`###` 用于分隔请求,指令可以重复、限制或验证某个请求。更多示例见:[`_examples/`](https://github.com/unkn0wn-root/resterm/blob/main/_examples)。
## CLI
`resterm run` 执行 `.http` / `.rest` 文件而无需打开 TUI,这正是 CI 所运行的方式。```bash
resterm run --request CreateUser requests.http
生成的项目会与本地模拟服务器通信。请先在另一个终端中启动它:```bash resterm mock requests.http
在 TUI 中,按 `g Shift+M` 即可从工作区启动相同的模拟服务器。
[CLI 文档](https://github.com/unkn0wn-root/resterm/blob/main/docs/cli.md) 涵盖了选择器、输出格式及更多示例。
## 键盘速查表
- 窗格焦点与布局
- `Tab` / `Shift+Tab`:在侧边栏、编辑器和响应之间移动。
- `g+r`、`g+i`、`g+p`:跳转到请求、编辑器或响应。
- `g+h` / `g+l`:水平调整大小。当侧边栏聚焦时更改侧边栏宽度,否则调整编辑器/响应分割。
- `g+j` / `g+k`:当编辑器/响应堆叠时调整其高度,在导航器中折叠或展开分支。
- `g+v` / `g+s`:在行内布局和堆叠布局之间切换响应窗格。
- `g+1`、`g+2`、`g+3`:最小化或恢复侧边栏、编辑器、响应。
- `g+z` / `g+Z`:缩放聚焦的窗格,清除缩放。
- 环境与全局变量
- `Ctrl+E`:切换环境。
- `Ctrl+G`:检查捕获的全局变量。
- 帮助与命令
- `?`:打开可搜索的离线帮助索引。
- `K`(编辑器普通模式):打开光标下指令、模板或关键字的帮助。
- `:help <主题>` / `:man <主题>`:打开嵌入式主题;`:docs <主题>` 打开版本匹配的完整手册。
- `Ctrl+O`:打开文件/工作区弹窗。输入以过滤,使用 `Up` / `Down` 滚动,使用 `Tab` 进入目录。
- `:`:打开命令行。使用 `Up` / `Down` 选择建议,`Tab` 补全一项,或 `Enter` 接受并运行所选内容。路径参数(如 `:mock start --source` 和 `:edit`)会在同一弹窗中浏览文件系统。
- 响应
- `Ctrl+V` / `Ctrl+U`:拆分响应窗格以进行并排比较。
- `Ctrl+Shift+C` 或 `g y`(响应聚焦时):复制整个 Pretty、Raw 或 Headers 标签页。
- `g x`:在不发送请求的情况下显示当前请求的 Explain 预览。
- `g e`:在外部编辑器中打开当前文件。
> [!TIP]
> 如果你只记得三个快捷键:
> - `Ctrl+Enter` 发送请求
> - `Tab` / `Shift+Tab` 切换窗格
> - `g+p` 跳转到响应
## 安装
**Linux / macOS(Homebrew)**```bash
brew install resterm
[!NOTE] Homebrew 安装应通过 Homebrew 更新(
brew upgrade resterm)。内置的resterm --update命令仅适用于从 GitHub releases 或安装脚本安装的二进制文件。
Linux / macOS(Shell 脚本)
[!IMPORTANT] 预构建的 Linux 二进制文件依赖 glibc 2.32 或更高版本。在较旧的发行版上,请使用较新的 glibc 工具链从源码构建,或先升级 glibc 再使用发布归档。```bash curl -fsSL https://raw.githubusercontent.com/unkn0wn-root/resterm/main/install.sh | bash
或使用 `wget`:```bash
wget -qO- https://raw.githubusercontent.com/unkn0wn-root/resterm/main/install.sh | bash
Windows (PowerShell)```powershell iwr -useb https://raw.githubusercontent.com/unkn0wn-root/resterm/main/install.ps1 | iex
脚本会检测你的架构,下载最新版本并安装二进制文件。
### 手动安装
> [!NOTE]
> 手动安装辅助工具使用 `curl` 和 `jq`。请使用你的包管理器安装 `jq`(例如 `brew install jq`、`sudo apt install jq` 等)。
**Linux / macOS**```bash
# Detect latest tag
LATEST_TAG=$(curl -fsSL https://api.github.com/repos/unkn0wn-root/resterm/releases/latest | jq -r .tag_name)
# Download the matching binary (Darwin/Linux + amd64/arm64)
curl -fL -o resterm "https://github.com/unkn0wn-root/resterm/releases/download/${LATEST_TAG}/resterm_$(uname -s)_$(uname -m)"
# Make it executable and move it onto your PATH
chmod +x resterm
sudo install -m 0755 resterm /usr/local/bin/resterm
Windows (PowerShell)```powershell $latest = Invoke-RestMethod https://api.github.com/repos/unkn0wn-root/resterm/releases/latest $asset = $latest.assets | Where-Object { $.name -like 'resterm_Windows*' } | Select-Object -First 1 Invoke-WebRequest -Uri $asset.browser_download_url -OutFile resterm.exe
Optionally relocate to a directory on PATH, e.g.:
Move-Item resterm.exe "$env:USERPROFILE\bin\resterm.exe"
### 来源```bash
go install github.com/unkn0wn-root/resterm/cmd/resterm@latest
更新```bash
resterm --check-update resterm --update
第一条命令用于报告是否有更新的版本可用。第二条命令负责下载、校验并就地安装。在 Windows 上,旧二进制文件会以 `resterm.exe.old` 的形式保留在新文件旁边,并在下次更新时被清理。
## 配置
- 环境是 JSON 文件(`resterm.env.json`),会在请求目录、工作区根目录或当前工作目录(CWD)中发现。一个文件可以定义命名环境或独立分组,例如 api、app 和 credentials,它们会合并为一个环境。Dotenv 文件(`.env`、`.env.*`)通过 `--env-file` 选择启用,且仅限单个工作区。参见[分组环境](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md#grouped-environments)以及 `_examples/grouped/` 中的可运行示例。
- 配置按操作系统存储,并可通过 `RESTERM_CONFIG_DIR` 覆盖:
- macOS:`~/Library/Application Support/resterm`
- Windows:`%APPDATA%\resterm`
- Linux/Unix:`~/.config/resterm`
## 模拟服务器
你可以在与请求相同的 `.http` 文件中定义模拟响应。
- 按查询、请求头或 JSON 请求体匹配传入请求,然后选择命名响应或默认响应。
- 返回一系列响应以用于轮询和重试测试。使用路径、查询、请求头或 Cookie 值来分别跟踪每个序列。
- 按固定时长延迟响应,或使用 `random`、`normal` 或 `jitter` 为每个请求提供不同的延迟。
- 基于路径、查询、请求头和请求体值构建响应,并支持用于动态数据的生成器。
- 使用 `@expect` 验证调用次数,或从 RestermScript 检查接收到的流量。
- 热重载源文件和夹具,并可选支持 TLS。
同一路由上的两种场景:```http
### Payment accepted
# @mock method=POST path=/payments name=accepted default=true latency=150ms
HTTP/1.1 202 Accepted
Content-Type: application/json
{"id":"pay_123","status":"pending"}
### Payment declined
# @mock method=POST path=/payments name=declined
# @match query={"mode":"decline"} headers={"X-Tenant":"demo"} json={"amount":0}
HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json
{"error":"amount must be positive"}
一次提供单个文件或整个目录:```bash resterm mock ./requests.http resterm mock --recursive --addr 127.0.0.1:9090 ./requests
更多内容请参阅 [Mock Servers 参考文档](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md#mock-servers)、[`resterm mock` CLI 指南](https://github.com/unkn0wn-root/resterm/blob/main/docs/cli.md#resterm-mock) 以及 [工作示例](https://github.com/unkn0wn-root/resterm/blob/main/_examples/mocks.http)。
## Headless
[`headless`](https://github.com/unkn0wn-root/resterm/blob/main/headless) 包是驱动 TUI 和 CLI 的同一引擎的公共 Go API。使用它可以在你自己的 Go 代码或 CI 中运行请求、工作流、断言、比较运行结果和配置文件。
如果你不想自己构建运行器,可以使用 [resterm-runner](https://github.com/unkn0wn-root/resterm-runner)。
## Collections
将工作区导出为 Git 友好的捆绑包,并导入到另一个工作区中。捆绑包携带包含校验和的 `manifest.json`,因此导入时会先验证文件完整性。环境值会以 `REPLACE_ME` 占位符的形式导出,因此机密信息永远不会离开你的机器。```bash
resterm collection export --workspace ./my-api --out ./shared/my-api-bundle
resterm collection import --in ./shared/my-api-bundle --workspace ./my-local-api
将 --dry-run 添加到预览导入中,将 --force 添加到覆盖现有文件中。文档:集合共享。
Curl 导入
将 curl 命令粘贴到编辑器中,然后按 Ctrl+Enter 将其转换为结构化请求。Resterm 能理解常见标志,合并重复的数据段,并保持 multipart 上传完整。像 sudo 或 $ 这样的 shell 前缀会被忽略。CLI 通过 --from-curl 执行相同的转换。
这个:```bash
curl -X POST https://api.example.com/login
-H "Content-Type: application/json"
--user demo:secret
-d '{"user":"demo"}'
变成这样:```http
### POST https://api.example.com/login
# @auth basic demo secret
POST https://api.example.com/login
Content-Type: application/json
{"user":"demo"}
RestermScript
RestermScript(RTS)是一种为Resterm构建的小型表达式语言。它直接面向请求格式、工作流和指令,使脚本保持简短且可预测。当你需要更多功能时,JavaScript钩子仍然可用。
快速示例(RTS模块 + 请求):```rts // rts/helpers.rts module helpers export fn authHeader(token) { return token ? "Bearer " + token : "" }
由于无法看到您提供的具体输入内容,我无法进行翻译。请提供需要翻译的文本内容。```http
# @use ./rts/helpers.rts
# @when env.has("feature")
# @assert response.statusCode == 200
GET https://api.example.com/users/{{= vars.get("user") }}
Authorization: {{= helpers.authHeader(vars.get("auth.token")) }}
Full reference: docs/restermscript.md。
深入解析
OAuth 2.0
使用 @auth oauth2 获取并注入令牌。令牌按环境缓存,并在可能时刷新。默认使用客户端凭证授权。同时支持密码授权和带 PKCE 的授权码模式:```http
Service status
@auth oauth2 token_url={{oauth.tokenUrl}} client_id={{oauth.clientId}} client_secret={{oauth.clientSecret}} cache_key=my-api
GET {{base.url}}/anything/projects
示例:[`_examples/oauth2.http`](https://github.com/unkn0wn-root/resterm/blob/main/_examples/oauth2.http)。请参阅 [OAuth 2.0 文档](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md#oauth-20-directive)。
### 工作流与脚本
工作流将命名请求串联起来,并可根据响应选择下一步:```http
### Sign in
# @workflow sign-in
# @step Login using=Login
// GetProfile and RefreshToken are request names.
// The first true condition runs the named request.
# @if last.statusCode == 200 run=GetProfile
# @elif last.statusCode == 401 run=RefreshToken
# @else fail="unexpected login response"
它们还可以在步骤之间传递数据,并运行 RestermScript 或 JavaScript 钩子。示例:_examples/workflows.http。参见工作流文档。
轮询与重试
使用 @poll 重复发送请求,直到响应条件变为真。添加 @retry 以指数退避方式重试网络故障、超时或选定的响应:```http
Wait for job
@retry count=4
@retry-when response.statusCode in [429, 502, 503]
@retry-backoff exponential(100ms, 2s) jitter=20%
@poll every=500ms timeout=30s until=response.json().status == "completed"
GET {{base.url}}/jobs/{{job.id}}
每个轮询周期都有自己独立的重试预算。示例:[`_examples/polling-retries.http`](https://github.com/unkn0wn-root/resterm/blob/main/_examples/polling-retries.http)。参见[轮询与重试文档](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md#polling-and-retries)。
### 比较运行
`@compare` 针对至少两个环境运行同一个请求,并以其中一个结果作为基线:```http
### Compare health
# @compare dev stage prod base=prod
GET {{services.api.base}}/status
按 g+c 在 TUI 中运行它,或在命令行中提供 --compare。示例:_examples/compare.http。参见 compare 文档。
追踪与时间线
@trace 记录 HTTP 各阶段,并可标记超出延迟预算的请求:```http
Trace API
@trace dns<=50ms connect<=120ms total<=400ms tolerance=25ms
GET https://api.example.com/health
结果会显示在“时间线”标签页中,并可导出到 OpenTelemetry。示例:[`_examples/trace.http`](https://github.com/unkn0wn-root/resterm/blob/main/_examples/trace.http)。请参阅[追踪文档](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md#timeline--tracing)。
### 流式传输(WebSocket 和 SSE)
`@sse` 记录服务器事件,而 `@websocket` 和 `@ws` 则编写 WebSocket 帧的脚本。两者都会在“流”标签页中生成记录:```http
### Events
# @sse duration=30s idle=10s max-events=5
GET https://api.example.com/events
### Chat
# @websocket idle=3s
# @ws send Hello
# @ws close 1000 done
GET wss://api.example.com/chat
Example: _examples/streaming.http。请参阅流式文档。
gRPC
使用 GRPC 请求行指定服务器,并使用 @grpc 指定完全限定的方法。请求体为 protobuf JSON:```http
Get user
@grpc users.UserService/GetUser
@grpc-plaintext true
GRPC {{grpc.host}}
{"tenantId":"{{tenant.id}}"}
服务器反射默认已启用。同时支持描述符集和流式调用。示例:[`_examples/grpc.http`](https://github.com/unkn0wn-root/resterm/blob/main/_examples/grpc.http)。参见 [gRPC 文档](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md#grpc)。
### OpenAPI 导入
从本地 OpenAPI 文档或 `http(s)` URL 生成请求、模拟或两者兼有:```bash
resterm --from-openapi _examples/openapi-spec.yml --http-out api.http --openapi-mode both
远程获取遵循 --insecure 和 --proxy。示例输入:_examples/openapi-spec.yml。参见导入文档。
SSH 隧道
在使用 SSH 配置文件的请求之前定义该配置文件,然后通过 use= 选择它:```http
// Set key to choose a key file. Leave it out to use your SSH agent or a default key.
@ssh file edge host=jump.example.com user=ops key=~/.ssh/id_ed25519
Internal API
@ssh use=edge
GET http://10.0.0.10/v1/health
Profiles 可以是文件级或工作区级的,同时也支持一次性内联隧道。示例:[`_examples/ssh.http`](https://github.com/unkn0wn-root/resterm/blob/main/_examples/ssh.http)。参见 [SSH 文档](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md#ssh-tunnels)。
### Kubernetes 端口转发
`@k8s` 会打开一个受管理的端口转发,指向 pod、service、deployment 或 statefulset:```http
### Service health
# @k8s namespace=default service=api port=http
GET http://api.default.svc.cluster.local/health
目标可以使用数字或命名端口,并且可以保存为可复用的配置文件。示例:_examples/k8s.http。参见 Kubernetes 文档。
主题与按键绑定
使用配置目录中的 themes/*.toml 和 bindings.toml 或 bindings.json 自定义颜色和按键绑定。文档:docs/resterm.md#theming 和 docs/resterm.md#custom-bindings。
文档
docs/resterm.md涵盖请求语法、指令、脚本和传输方式。docs/cli.md涵盖resterm run、导入器、集合和历史记录。- 兼容性 解释了 Resterm 对 v1 的兼容性保证。
在 TUI 中,按 ? 或运行 :help。当您需要已安装版本的完整网页手册时,请使用 :docs。