
resterm v1.5.6
HTTP, GraphQL 및 gRPC용 터미널 API 클라이언트. diff 및 버전 관리가 가능한 일반 .http 파일로, 워크플로, 목(mocks), 프로파일링, 추적(tracing), OpenAPI 가져오기, SSH 터널, Kubernetes 포트 포워딩, WebSocket, SSE 및 CLI 러너를 지원합니다.
Resterm
REST, GraphQL, gRPC, WebSocket 및 SSE를 위한 터미널 기반 API 클라이언트이자 워크벤치입니다.
Resterm은 API-as-code 워크벤치입니다. 더 익숙한 용어로 말하면 API 클라이언트이며, diff, 리뷰, 버전 관리가 가능한 일반 .http 및 .rest 파일을 기반으로 구축되었습니다. 대화형 요청 편집과 선언적 워크플로우, 어서션, 목(mock) 서버, 트레이싱, 프로파일링, 헤드리스 자동화를 결합합니다. 모든 것은 사용자 머신에만 저장됩니다. 계정 없음, 클라우드 동기화 없음, 텔레메트리 없음.
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 출력을 지원합니다. - 목(mock) 서버는 모방하는 요청 옆에 선언되며, 매칭 규칙, 시퀀스, 호출 검증 및 핫 리로드를 지원합니다.
- 타임라인 트레이싱, 프로파일링 및 환경 간 실행 비교를 지원합니다.
- 스트리밍 트랜스크립트와 WebSocket 및 SSE용 대화형 콘솔을 제공합니다.
- AI 통합은 절대 없습니다.
빠른 시작
- Resterm을 설치합니다(설치 섹션에서 스크립트, Windows 및 수동 설치 방법 참조). ```bash
brew install resterm
- 작업 공간을 부트스트랩합니다. ```bash
mkdir my-api && cd my-api
resterm init
resterm init는 인터넷 연결 없이도 작동하는 작은 프로젝트를 제공합니다. 생성된 requests.http에는 로컬 목(mock) 시나리오와 서로 연계되는 몇 가지 요청이 포함되어 있습니다. 이들은 어서션(assertions), 베어러 인증(bearer auth), 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
생성된 프로젝트는 로컬 목(mock) 서버와 통신합니다. 먼저 다른 터미널에서 서버를 시작하세요:```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]
> 세 가지 단축키만 기억한다면:
> - `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
or `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`로 새 바이너리 옆에 유지되며 다음 업데이트 시 정리됩니다.
## 구성
- 환경은 요청 디렉터리, 작업 영역 루트 또는 CWD에서 발견되는 JSON 파일(`resterm.env.json`)입니다. 파일은 api, app, credentials와 같은 명명된 환경 또는 독립 그룹을 정의할 수 있으며, 이들은 하나의 환경으로 결합됩니다. 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 본문으로 들어오는 요청을 매칭한 다음 명명된 응답 또는 기본 응답을 선택합니다.
- 폴링 및 재시도 테스트를 위해 응답 시퀀스를 반환합니다. 경로, 쿼리, 헤더 또는 쿠키 값을 사용하여 각 시퀀스를 개별적으로 추적합니다.
- 고정 시간만큼 응답을 지연시키거나 `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나 $ 같은 셸 접두사는 무시됩니다. 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 : "" }
Please provide the Markdown content to translate.```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. 비교 문서를 참조하세요.
추적 및 타임라인
@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에서 요청, 목(mock) 또는 둘 다 생성합니다:```bash
resterm --from-openapi _examples/openapi-spec.yml --http-out api.http --openapi-mode both
Remote fetches는 --insecure 및 --proxy를 존중합니다. 입력 예시: _examples/openapi-spec.yml. import 문서를 참조하세요.
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를 실행하세요. 설치된 릴리스의 전체 웹 매뉴얼이 필요하면 :docs를 사용하세요.