Zurück zu den Updates
New releaseSep 5, 2026

resterm v1.5.6

Terminal-API-Client für HTTP, GraphQL und gRPC. Einfache .http-Dateien zum Diffen und Versionieren, mit Workflows, Mocks, Profiling, Tracing, OpenAPI-Import, SSH-Tunneln, Kubernetes-Port-Forwards, WebSocket, SSE und einem CLI-Runner.

Teilen

Resterm
Resterm

Ein terminalbasierter API-Client und Workbench für REST, GraphQL, gRPC, WebSocket und SSE.

Screenshot der Resterm TUI-Basis

Resterm ist eine API-as-Code-Workbench – oder, in vertrauteren Begriffen, ein API-Client – aufgebaut um einfache .http- und .rest-Dateien, die du diffen, überprüfen und versionieren kannst. Es kombiniert interaktive Anfragebearbeitung mit deklarativen Workflows, Assertions, Mock-Servern, Tracing, Profiling und headless Automatisierung. Alles bleibt auf deinem Rechner. Keine Konten, kein Cloud-Sync, keine Telemetrie.

Wenn du nach einem Postman-artigen Client suchst, der sich auf GUI-Sammlungen konzentriert, ist Resterm wahrscheinlich nicht das Richtige für dich – aber probier es trotzdem aus!

[!NOTE] Resterm ist jetzt v1! Siehe die v1.0.0-Versionshinweise für neue Funktionen und Breaking Changes.

Schnellzugriffe: Screenshots, Schnellstart, Anfragedateien, Installation, Dokumentation.

Screenshot-Tour

Siehe die UI in Aktion (zum Erweitern klicken)

Workflows

Screenshot von Resterm mit Workflow

Trace und Timeline

Screenshot von Resterm mit Timeline

Profiler

Screenshot des Resterm-Profilers

Erklären

Screenshot des Resterm-Explain-Tabs

RestermScript

Screenshot von Resterm mit RestermScript

Helles Theme

Screenshot von Resterm im hellen Theme

OAuth-Browser-Demo (altes UI-Design)

Resterm-OAuth-Flow

Warum Resterm

  • HTTP, GraphQL, gRPC, WebSocket und SSE sofort einsatzbereit.
  • Automatisierung lebt in den Anfragedateien: Bedingungen (@when, @if/@elif/@else, @for-each), mehrstufige Workflows (@workflow / @step), Captures, Variablen und Assertions (@capture, @var, @assert).
  • RestermScript, eine kleine, für Resterm entwickelte Ausdruckssprache, mit JavaScript-Hooks, wenn du sie möchtest.
  • Vim-artige Steuerung mit kontextuellen Hinweisen in der unteren Leiste, durchsuchbarer Offline-Hilfe, K-Hilfe unter dem Cursor, /-Suche und Befehlen wie :w, :q, :help und :docs.
  • Integrierte Authentifizierung und Tunneling: OAuth 2.0 (Client Credentials, Passwort, Auth Code mit PKCE), Authentifizierung über deine vorhandenen CLIs, SSH-Tunnel und Kubernetes-Port-Forwards. Keine zusätzlichen Tools nötig.
  • CLI-Runner: resterm run für skriptgesteuerte Läufe und CI, mit JSON- und JUnit-Ausgabe.
  • Mock-Server, die neben den Anfragen deklariert werden, die sie nachahmen, mit Matching-Regeln, Sequenzen, Aufrufverifizierung und Hot Reload.
  • Timeline-Tracing, Profiling und Vergleichsläufe über Umgebungen hinweg.
  • Streaming-Transkripte und eine interaktive Konsole für WebSocket und SSE.
  • Keine KI-Integration, jemals.

Schnellstart

  1. Installiere Resterm (siehe Installation für Skripte, Windows und manuelle Installationen). ```bash brew install resterm
  2. Einen Arbeitsbereich einrichten. ```bash mkdir my-api && cd my-api resterm init

resterm init erstellt dir ein kleines Projekt, das ohne Internetverbindung funktioniert. Die generierte requests.http enthält lokale Mock-Szenarien und einige Anfragen, die aufeinander aufbauen. Sie decken Assertions, Bearer-Auth, JSON-Matching, json-rules und @for-each ab.

  1. Starte es und sende deine erste Anfrage. ```bash resterm

Drücke Ctrl+Enter im Editor, um die markierte Anfrage zu senden.

Noch keine Dateien? Führe einfach resterm aus, gib eine URL ein und drücke Ctrl+Enter. Ein eingefügter curl-Befehl funktioniert ebenfalls.

Anfragedateien

Resterm-Anfragedateien verwenden die standardmäßige HTTP-Syntax sowie # @-Direktiven für Konfiguration und Automatisierung:```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 }}"}

Einstellungen vor der ersten Anfrage gelten für die gesamte Datei, `###` trennt Anfragen, und Direktiven können eine Anfrage wiederholen, begrenzen oder validieren. Weitere Beispiele hier: [`_examples/`](https://github.com/unkn0wn-root/resterm/blob/main/_examples).

## CLI

`resterm run` führt `.http`- / `.rest`-Dateien aus, ohne die TUI zu öffnen, was CI ausführt.```bash
resterm run --request CreateUser requests.http

Das generierte Projekt kommuniziert mit einem lokalen Mock-Server. Starten Sie ihn zuerst in einem anderen Terminal:```bash resterm mock requests.http

In der TUI drückst du stattdessen `g Shift+M`, um denselben Mock-Server aus dem Workspace zu starten.

Die [CLI-Dokumentation](https://github.com/unkn0wn-root/resterm/blob/main/docs/cli.md) behandelt Selektoren, Ausgabeformate und weitere Beispiele.

## Tastatur-Spickzettel

- Fokus und Layout der Bereiche
  - `Tab` / `Shift+Tab`: Wechsel zwischen Seitenleiste, Editor und Antwort.
  - `g+r`, `g+i`, `g+p`: Springe zu Requests, Editor oder Antwort.
  - `g+h` / `g+l`: Größe horizontal ändern. Ändert die Seitenbreite, wenn die Seitenleiste fokussiert ist, andernfalls die Aufteilung Editor/Antwort.
  - `g+j` / `g+k`: Größe von Editor/Antwort ändern, wenn sie gestapelt sind; Zweige im Navigator einklappen oder erweitern.
  - `g+v` / `g+s`: Antwortbereich zwischen Inline- und gestapeltem Layout umschalten.
  - `g+1`, `g+2`, `g+3`: Seitenleiste, Editor oder Antwort minimieren oder wiederherstellen.
  - `g+z` / `g+Z`: Fokussierten Bereich zoomen, Zoom aufheben.
- Umgebungen und Globals
  - `Ctrl+E`: Umgebungen wechseln.
  - `Ctrl+G`: Erfasste Globals anzeigen.
- Hilfe und Befehle
  - `?`: Durchsuchbaren Offline-Hilfeindex öffnen.
  - `K` (Editor-Normalmodus): Hilfe für die Direktive, Vorlage oder das Schlüsselwort unter dem Cursor öffnen.
  - `:help <Thema>` / `:man <Thema>`: Eingebettetes Thema öffnen; `:docs <Thema>` öffnet das versionsabgestimmte vollständige Handbuch.
  - `Ctrl+O`: Datei-/Workspace-Popup öffnen. Tippen zum Filtern, mit `Up` / `Down` scrollen und mit `Tab` in Verzeichnisse absteigen.
  - `:`: Befehlszeile öffnen. Mit `Up` / `Down` Vorschläge auswählen, mit `Tab` einen vervollständigen oder mit `Enter` eine Auswahl annehmen und ausführen. Pfadargumente wie `:mock start --source` und `:edit` durchsuchen das Dateisystem im selben Popup.
- Antworten
  - `Ctrl+V` / `Ctrl+U`: Antwortbereich für einen Seitenvergleich aufteilen.
  - `Ctrl+Shift+C` oder `g y` (Antwort fokussiert): Den gesamten Pretty-, Raw- oder Headers-Tab kopieren.
  - `g x`: Explain-Vorschau für den aktiven Request anzeigen, ohne ihn zu senden.
  - `g e`: Aktuelle Datei im externen Editor öffnen.

> [!TIP]
> Wenn du dir nur drei Tastenkürzel merkst:
> - `Ctrl+Enter` sendet den Request
> - `Tab` / `Shift+Tab` wechselt die Bereiche
> - `g+p` springt zur Antwort

## Installation

**Linux / macOS (Homebrew)**```bash
brew install resterm

[!NOTE] Homebrew-Installationen sollten mit Homebrew aktualisiert werden (brew upgrade resterm). Der integrierte Befehl resterm --update ist für Binärdateien gedacht, die aus GitHub-Releases oder Installationsskripten installiert wurden.

Linux / macOS (Shell-Skript)

[!IMPORTANT] Vorgefertigte Linux-Binärdateien sind auf glibc 2.32 oder neuer angewiesen. Verwenden Sie auf einer älteren Distribution den Quellcode-Build mit einer neueren glibc-Toolchain oder aktualisieren Sie glibc, bevor Sie die Release-Archive verwenden.```bash curl -fsSL https://raw.githubusercontent.com/unkn0wn-root/resterm/main/install.sh | bash

or mit `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

Die Skripte erkennen deine Architektur, laden die neueste Version herunter und installieren die Binärdatei.

### Manuelle Installation

> [!NOTE]
> Das Hilfsskript für die manuelle Installation verwendet `curl` und `jq`. Installiere `jq` mit deinem Paketmanager (`brew install jq`, `sudo apt install jq` usw.).

**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"

### Aus der Quelle```bash
go install github.com/unkn0wn-root/resterm/cmd/resterm@latest

Update```bash

resterm --check-update resterm --update

Die erste Meldung zeigt an, ob eine neuere Version verfügbar ist. Die zweite lädt sie herunter, verifiziert sie und installiert sie direkt. Unter Windows bleibt die alte Binärdatei neben der neuen als `resterm.exe.old` erhalten und wird beim nächsten Update bereinigt.

## Konfiguration

- Umgebungen sind JSON-Dateien (`resterm.env.json`), die im Anfrageverzeichnis, im Workspace-Root oder im aktuellen Arbeitsverzeichnis gefunden werden. Eine Datei kann benannte Umgebungen oder unabhängige Gruppen definieren, zum Beispiel api, app und credentials, die sich zu einer Umgebung kombinieren. Dotenv-Dateien (`.env`, `.env.*`) werden optional über `--env-file` aktiviert und gelten nur für einen einzelnen Workspace. Siehe [gruppierte Umgebungen](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md#grouped-environments) und das ausführbare Beispiel in `_examples/grouped/`.
- Die Konfiguration wird pro Betriebssystem gespeichert und kann mit `RESTERM_CONFIG_DIR` überschrieben werden:
  - macOS: `~/Library/Application Support/resterm`
  - Windows: `%APPDATA%\resterm`
  - Linux/Unix: `~/.config/resterm`

## Mock-Server

Sie können Mock-Antworten in denselben `.http`-Dateien definieren wie Ihre Anfragen.

- Gleichen Sie eingehende Anfragen nach Query, Headern oder JSON-Body ab und wählen Sie dann eine benannte oder Standardantwort.
- Geben Sie eine Sequenz von Antworten für Polling- und Retry-Tests zurück. Verwenden Sie einen Pfad, eine Query, einen Header oder einen Cookie-Wert, um jede Sequenz separat zu verfolgen.
- Verzögern Sie Antworten um einen festen Betrag oder geben Sie jeder Anfrage mit `random`, `normal` oder `jitter` eine andere Verzögerung.
- Erstellen Sie Antworten aus Pfad-, Query-, Header- und Body-Werten, mit Generatoren für dynamische Daten.
- Verifizieren Sie Aufrufzahlen mit `@expect` oder prüfen Sie empfangenen Datenverkehr aus RestermScript.
- Hot Reload von Quelldateien und Fixtures, mit optionalem TLS.

Zwei Szenarien auf einer Route:```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"}

Servieren Sie eine Datei oder ein ganzes Verzeichnis:```bash resterm mock ./requests.http resterm mock --recursive --addr 127.0.0.1:9090 ./requests

Mehr in der [Mock-Server-Referenz](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md#mock-servers), dem [`resterm mock`-CLI-Leitfaden](https://github.com/unkn0wn-root/resterm/blob/main/docs/cli.md#resterm-mock) und dem [funktionierenden Beispiel](https://github.com/unkn0wn-root/resterm/blob/main/_examples/mocks.http).

## Headless

Das [`headless`](https://github.com/unkn0wn-root/resterm/blob/main/headless)-Paket ist die öffentliche Go-API für dieselbe Engine, die auch die TUI und CLI antreibt. Verwenden Sie es, um Anfragen, Workflows, Assertions auszuführen, Läufe zu vergleichen und Profile aus Ihrem eigenen Go-Code oder CI zu nutzen.

Wenn Sie lieber keinen eigenen Runner bauen möchten, gibt es [resterm-runner](https://github.com/unkn0wn-root/resterm-runner).

## Sammlungen

Exportieren Sie einen Arbeitsbereich als Git-freundliches Bündel und importieren Sie es in einen anderen. Bündel enthalten eine `manifest.json` mit Prüfsummen, sodass Importe zuerst die Dateiintegrität verifizieren. Umgebungsvariablen werden als `REPLACE_ME`-Platzhalter exportiert, sodass Geheimnisse Ihr Gerät nie verlassen.```bash
resterm collection export --workspace ./my-api --out ./shared/my-api-bundle
resterm collection import --in ./shared/my-api-bundle --workspace ./my-local-api

Füge --dry-run hinzu, um einen Import in der Vorschau anzusehen, und --force, um vorhandene Dateien zu überschreiben. Dokumentation: Sammlungsfreigabe.

Curl-Import

Füge einen Curl-Befehl in den Editor ein und drücke Ctrl+Enter, um ihn in eine strukturierte Anfrage umzuwandeln. Resterm versteht die gängigen Flags, führt wiederholte Datensegmente zusammen und hält Multipart-Uploads intakt. Shell-Präfixe wie sudo oder $ werden ignoriert. Die CLI führt dieselbe Konvertierung mit --from-curl durch.

Dies:```bash curl -X POST https://api.example.com/login
-H "Content-Type: application/json"
--user demo:secret
-d '{"user":"demo"}'

wird zu diesem:```http
### POST https://api.example.com/login
# @auth basic demo secret
POST https://api.example.com/login
Content-Type: application/json

{"user":"demo"}

Docs: Inline-Anfragen und Import-Beispiele.

RestermScript

RestermScript (RTS) ist eine kleine Ausdruckssprache, die für Resterm entwickelt wurde. Sie zielt direkt auf das Anfrageformat, Workflows und Direktiven ab, wodurch Skripte kurz und vorhersehbar bleiben. JavaScript-Hooks bleiben verfügbar, wenn du mehr benötigst.

Kurzes Beispiel (RTS-Modul + Anfrage):```rts // rts/helpers.rts module helpers export fn authHeader(token) { return token ? "Bearer " + token : "" }

2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1```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`](https://github.com/unkn0wn-root/resterm/blob/main/docs/restermscript.md).

## Deep dive

### OAuth 2.0

Verwenden Sie `@auth oauth2`, um Tokens zu erwerben und einzufügen. Tokens werden pro Umgebung zwischengespeichert und, wenn möglich, aktualisiert. Der Client-Credentials-Grant ist die Standardeinstellung. Der Password-Grant und der Autorisierungscode mit PKCE werden ebenfalls unterstützt:```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

Beispiel: _examples/oauth2.http. Siehe die OAuth-2.0-Dokumentation.

Workflows und Skripterstellung

Workflows verketten benannte Anfragen und können den nächsten Schritt anhand einer Antwort auswählen:```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"

Sie können auch Daten zwischen Schritten übergeben und RestermScript- oder JavaScript-Hooks ausführen. Beispiel: [`_examples/workflows.http`](https://github.com/unkn0wn-root/resterm/blob/main/_examples/workflows.http). Siehe die [Workflow-Dokumentation](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md#workflows).

### Polling und Wiederholungen

Verwenden Sie `@poll`, um eine Anfrage zu wiederholen, bis eine Antwortbedingung wahr wird. Fügen Sie `@retry` hinzu, um Netzwerkfehler, Timeouts oder ausgewählte Antworten mit exponentiellem Backoff erneut zu versuchen:```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}}

Jeder Abfragezyklus erhält sein eigenes Wiederholungsbudget. Beispiel: _examples/polling-retries.http. Siehe die Dokumentation zu Abfragen und Wiederholungen.

Läufe vergleichen

@compare führt eine Anfrage gegen mindestens zwei Umgebungen aus und verwendet ein Ergebnis als Basislinie:```http

Compare health

@compare dev stage prod base=prod

GET {{services.api.base}}/status

Drücke `g+c`, um es in der TUI auszuführen, oder gib `--compare` in der Befehlszeile an. Beispiel: [`_examples/compare.http`](https://github.com/unkn0wn-root/resterm/blob/main/_examples/compare.http). Siehe die [Vergleichsdokumentation](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md#compare-runs).

### Tracing und Zeitachse

`@trace` zeichnet HTTP-Phasen auf und kann Anfragen kennzeichnen, die Latenzbudgets überschreiten:```http
### Trace API
# @trace dns<=50ms connect<=120ms total<=400ms tolerance=25ms
GET https://api.example.com/health

Ergebnisse erscheinen im Tab „Timeline“ und können nach OpenTelemetry exportiert werden. Beispiel: _examples/trace.http. Siehe die Tracing-Dokumentation.

Streaming (WebSocket und SSE)

@sse zeichnet Server-Ereignisse auf, während @websocket und @ws WebSocket-Frames skripten. Beide erzeugen Transkripte im Tab „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`](https://github.com/unkn0wn-root/resterm/blob/main/_examples/streaming.http). Siehe die [Streaming-Dokumentation](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md#streaming-sse--websocket).

### gRPC

Verwenden Sie eine `GRPC`-Anfragezeile für den Server und `@grpc` für die vollständig qualifizierte Methode. Der Body ist protobuf JSON:```http
### Get user
# @grpc users.UserService/GetUser
# @grpc-plaintext true
GRPC {{grpc.host}}

{"tenantId":"{{tenant.id}}"}

Server-Reflexion ist standardmäßig aktiviert. Deskriptor-Sets und Streaming-Aufrufe werden ebenfalls unterstützt. Beispiel: _examples/grpc.http. Siehe die gRPC-Dokumentation.

OpenAPI-Import

Generieren Sie Anfragen, Mocks oder beides aus einem lokalen OpenAPI-Dokument oder einer http(s)-URL:```bash resterm --from-openapi _examples/openapi-spec.yml --http-out api.http --openapi-mode both

Remote-Fetches respektieren `--insecure` und `--proxy`. Beispiel-Eingabe: [`_examples/openapi-spec.yml`](https://github.com/unkn0wn-root/resterm/blob/main/_examples/openapi-spec.yml). Siehe die [Import-Dokumentation](https://github.com/unkn0wn-root/resterm/blob/main/docs/cli.md#import-examples).

### SSH-Tunnel

Definieren Sie ein SSH-Profil vor den Requests, die es verwenden, und wählen Sie es dann mit `use=` aus:```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

Profile können datei- oder arbeitsbereichsweit sein, und einmalige Inline-Tunnel werden ebenfalls unterstützt. Beispiel: _examples/ssh.http. Siehe die SSH-Dokumentation.

Kubernetes-Port-Forwards

@k8s öffnet einen verwalteten Port-Forward zu einem Pod, Service, Deployment oder StatefulSet:```http

Service health

@k8s namespace=default service=api port=http

GET http://api.default.svc.cluster.local/health

Ziele können numerische oder benannte Ports verwenden und als wiederverwendbare Profile gespeichert werden. Beispiel: [`_examples/k8s.http`](https://github.com/unkn0wn-root/resterm/blob/main/_examples/k8s.http). Siehe die [Kubernetes-Dokumentation](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md#kubernetes-port-forwards).

### Themes und Tastenzuordnungen

Passen Sie Farben und Tastenzuordnungen mit `themes/*.toml` und `bindings.toml` oder `bindings.json` im Konfigurationsverzeichnis an. Dokumentation: [`docs/resterm.md#theming`](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md#theming) und [`docs/resterm.md#custom-bindings`](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md#custom-bindings).

## Dokumentation

- [`docs/resterm.md`](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md) behandelt Anforderungssyntax, Direktiven, Skripterstellung und Transporte.
- [`docs/cli.md`](https://github.com/unkn0wn-root/resterm/blob/main/docs/cli.md) behandelt `resterm run`, Importeure, Sammlungen und Verlauf.
- [Kompatibilität](https://github.com/unkn0wn-root/resterm/blob/main/docs/resterm.md#compatibility) erläutert die Kompatibilitätsgarantien von Resterm für v1.

Drücken Sie in der TUI `?` oder führen Sie `:help` aus. Verwenden Sie `:docs`, wenn Sie das vollständige Web-Handbuch für die installierte Version wünschen.

## Lizenz

[Apache License 2.0](https://github.com/unkn0wn-root/resterm/blob/main/LICENSE).

Kategorien