
resterm v1.5.6
HTTP、GraphQL、gRPC対応のターミナルAPIクライアント。diffやバージョン管理ができるプレーンな.httpファイルで、ワークフロー、モック、プロファイリング、トレーシング、OpenAPIインポート、SSHトンネル、Kubernetesポートフォワード、WebSocket、SSE、CLIランナーを備えています。
Resterm
REST、GraphQL、gRPC、WebSocket、SSE に対応したターミナルネイティブな API クライアント兼ワークベンチ。
Resterm は API-as-code ワークベンチ、つまり馴染みのある言葉で言えば API クライアントであり、diff・レビュー・バージョン管理が可能なプレーンな .http ファイルと .rest ファイルを中心に構築されています。対話的なリクエスト編集と、宣言型ワークフロー、アサーション、モックサーバー、トレーシング、プロファイリング、ヘッドレス自動化を組み合わせています。すべてはお使いのマシン上で完結します。アカウント不要、クラウド同期なし、テレメトリなし。
GUI コレクションを中心とした Postman 風クライアントをお探しなら、Resterm はおそらく 向いていません が、それでも一度試してみてください!
[!NOTE] Resterm は現在 v1 です! 新機能と破壊的変更については v1.0.0 リリースノート を参照してください。
クイックリンク: スクリーンショット、クイックスタート、リクエストファイル、インストール、ドキュメント。
スクリーンショットツアー
UI の動作を確認する(クリックで展開)
ワークフロー
トレースとタイムライン
プロファイラー
説明(Explain)
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 ランナー: スクリプト実行と CI 用の
resterm runで、JSON と JUnit 出力に対応。 - モックサーバー は、模倣対象のリクエストの隣に宣言し、マッチングルール、シーケンス、呼び出し検証、ホットリロードに対応。
- タイムラインのトレーシング、プロファイリング、環境間の実行比較。
- ストリーミングのトランスクリプト と WebSocket・SSE 用の対話コンソール。
- AI 統合は一切なし。
クイックスタート
- Resterm をインストールします(インストール のスクリプト、Windows、手動インストールを参照)。 ```bash
brew install resterm
- ワークスペースをブートストラップします。 ```bash
mkdir my-api && cd my-api
resterm init
resterm init は、インターネット接続なしで動作する小さなプロジェクトを提供します。生成された requests.http には、ローカルのモックシナリオと、相互に依存するいくつかのリクエストが含まれています。これらは、アサーション、ベアラー認証、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` は、TUI を開かずに `.http` / `.rest` ファイルを実行します。これは 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 <topic>` / `:man <topic>`: 埋め込みトピックを開きます。`:docs <topic>` はバージョン対応の完全マニュアルを開きます。
- `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]
> 3つのショートカットだけ覚えておくなら:
> - `Ctrl+Enter` でリクエストを送信
> - `Tab` / `Shift+Tab` でペインを切り替え
> - `g+p` でレスポンスにジャンプ
## インストール
**Linux / macOS (Homebrew)**```bash
brew install resterm
[!NOTE] Homebrew によるインストールは Homebrew(
brew upgrade resterm)で更新してください。組み込みのresterm --updateコマンドは、GitHub リリースまたはインストールスクリプトからインストールされたバイナリ用です。
Linux / macOS(シェルスクリプト)
[!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
最初のコマンドは、新しいリリースが利用可能かどうかを報告します。2番目のコマンドは、それをダウンロードして検証し、その場にインストールします。Windowsでは、古いバイナリは`resterm.exe.old`として新しいバイナリの隣に残り、次の更新時にクリーンアップされます。
## 設定
- 環境はJSONファイル(`resterm.env.json`)で、リクエストディレクトリ、ワークスペースルート、またはCWDで検出されます。ファイルは、api、app、credentialsなどの名前付き環境または独立したグループを定義でき、それらが1つの環境に結合されます。Dotenvファイル(`.env`、`.env.*`)は`--env-file`によるオプトインで、単一ワークスペース用です。[グループ化された環境](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md#grouped-environments)と、`_examples/grouped/`にある実行可能なサンプルを参照してください。
- 設定はOSごとに保存され、`RESTERM_CONFIG_DIR`で上書きできます:
- macOS: `~/Library/Application Support/resterm`
- Windows: `%APPDATA%\resterm`
- Linux/Unix: `~/.config/resterm`
## モックサーバー
リクエストと同じ`.http`ファイル内でモックレスポンスを定義できます。
- クエリ、ヘッダー、またはJSONボディで受信リクエストを照合し、名前付きまたはデフォルトのレスポンスを選択します。
- ポーリングやリトライテスト用に、レスポンスのシーケンスを返します。パス、クエリ、ヘッダー、またはCookie値を使用して、各シーケンスを個別に追跡します。
- 固定時間だけレスポンスを遅延させるか、`random`、`normal`、または`jitter`を使用してリクエストごとに異なる遅延を与えます。
- パス、クエリ、ヘッダー、ボディの値からレスポンスを構築し、動的データ用のジェネレーターを使用します。
- `@expect`で呼び出し回数を検証するか、RestermScriptから受信トラフィックを検査します。
- ソースファイルとフィクスチャをホットリロードし、オプションでTLSをサポートします。
1つのルート上の2つのシナリオ:```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"}
1つのファイルまたはディレクトリ全体を提供します:```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`](https://github.com/unkn0wn-root/resterm/blob/main/headless) パッケージは、TUI と CLI を支える同じエンジンに対する公開 Go API です。これを使用して、独自の Go コードや CI からリクエスト、ワークフロー、アサーションの実行、実行結果の比較、プロファイルの比較を行うことができます。
自分でランナーを構築したくない場合は、[resterm-runner](https://github.com/unkn0wn-root/resterm-runner) があります。
## コレクション
ワークスペースを 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 は一般的なフラグを理解し、繰り返されるデータセグメントを統合し、マルチパートアップロードをそのまま保持します。sudo や $ などのシェルプレフィックスは無視されます。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"}
Docs: インラインリクエスト と インポート例。
RestermScript
RestermScript (RTS) は、Resterm 用に構築された小さな式言語です。リクエスト形式、ワークフロー、ディレクティブを直接対象とするため、スクリプトは短く予測可能なものに保たれます。さらに必要な場合には、JavaScript フックも引き続き利用できます。
簡単な例 (RTS モジュール + リクエスト):```rts // rts/helpers.rts module helpers export fn authHeader(token) { return token ? "Bearer " + token : "" }
I need the actual content of chunk 41 to translate it. Please provide the Markdown text you want translated.```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` は、1つのリクエストを少なくとも2つの環境に対して実行し、そのうちの1つの結果をベースラインとして使用します:```http
### Compare health
# @compare dev stage prod base=prod
GET {{services.api.base}}/status
g+c を押すと TUI で実行され、コマンドラインで --compare を指定することもできます。例: _examples/compare.http。比較ドキュメント を参照してください。
トレースとタイムライン
@trace は HTTP フェーズを記録し、レイテンシ予算を超えるリクエストにフラグを立てることができます:```http
Trace API
@trace dns<=50ms connect<=120ms total<=400ms tolerance=25ms
GET https://api.example.com/health
Timeline タブに結果が表示され、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 フレームをスクリプト化します。どちらも Stream タブにトランスクリプトを生成します:```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
プロファイルはファイル全体またはワークスペース全体に適用でき、一回限りのインライン・トンネルもサポートされています。例: [`_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` は、ポッド、サービス、デプロイメント、またはステートフルセットへの管理されたポートフォワードを開きます:```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、インポーター、コレクション、履歴を網羅しています。- 互換性は、v1に対するRestermの互換性保証について説明しています。
TUI内では、?を押すか:helpを実行してください。インストール済みリリースの完全なWebマニュアルが必要な場合は:docsを使用してください。