REST Client

GitHub概要

Huachao/vscode-restclient

REST Client Extension for Visual Studio Code

スター5,657
ウォッチ63
フォーク479
作成日:2016年3月30日
言語:TypeScript
ライセンス:MIT License

トピックス

graphqlhttphttp-clientrestrest-apirest-clienttypescriptvisual-studio-codevscodevscode-extension

スター履歴

Huachao/vscode-restclient Star History
データ取得日時: 2025/7/17 02:30

API開発ツール

REST Client

概要

REST Client(RESTクライアント)は、VS Code用の軽量HTTPクライアント拡張です。シンプルなテキストファイル(.http/.rest)でAPIリクエストを定義し、エディタ内で直接実行できます。Git管理が容易で、UIを持たないミニマルな設計により、開発者のプライバシーと効率性を重視するチームに根強い人気があります。

詳細

REST Clientは、Visual Studio Code内でHTTPリクエストを送信し、レスポンスを表示するための拡張機能です。260万回以上ダウンロードされている人気の高い拡張で、その特徴は徹底的にシンプルな設計にあります。リクエスト設定は.httpまたは.rest拡張子のプレーンテキストファイルに記述し、複雑なGUIは一切使用しません。この設計により、PostmanやFiddlerでは困難なリクエスト設定の共有とバージョン管理が簡単に実現できます。シンタックスハイライト、GraphQLサポート、multipart/form-data対応、ファイルアップロード、プロキシサポート、SOAPリクエスト送信など、基本的なAPI開発で必要な機能を網羅しています。複数のリクエストを単一ファイルに記述でき、リクエスト履歴の管理も可能です。テキストベースの設定により、チーム間でのAPI仕様共有、ドキュメント化、CI/CDパイプラインとの統合が自然に行えます。VS Codeエコシステムとの完全統合により、開発ワークフローを中断することなくAPI開発が進められます。

メリット・デメリット

メリット

  • テキストベース設計: プレーンテキストでリクエストを定義、可読性が高い
  • Git完全連携: バージョン管理と差分確認が自然に行える
  • 軽量ミニマル: UIを持たず、VS Code内で完結する設計
  • 共有性: ファイルベースでチーム共有やドキュメント化が容易
  • 学習コスト低: シンプルなHTTP構文で直感的に理解可能
  • 拡張性: 環境変数、認証、プロキシなど実用的機能を装備
  • 無料: オープンソースで完全無料
  • GraphQL対応: GraphQLクエリもサポート

デメリット

  • VS Code依存: VS Code専用で他エディタでは利用不可
  • UI不足: GUIベースの便利機能が制限的
  • 複雑操作: 高度なテストやスクリプト機能が限定的
  • ビジュアル不足: レスポンス表示がテキストベースのみ
  • 学習必要: HTTP構文の理解が必要

参考ページ

書き方の例

基本的なHTTPリクエスト(.httpファイル)

# ユーザー取得API
GET https://api.example.com/users/{{userId}} HTTP/1.1
Authorization: Bearer {{accessToken}}
Content-Type: application/json
Accept: application/json

###

# ユーザー作成API
POST https://api.example.com/users HTTP/1.1
Authorization: Bearer {{accessToken}}
Content-Type: application/json

{
  "name": "田中太郎",
  "email": "[email protected]",
  "age": 30,
  "department": "engineering"
}

###

# ユーザー更新API
PUT https://api.example.com/users/{{userId}} HTTP/1.1
Authorization: Bearer {{accessToken}}
Content-Type: application/json

{
  "name": "田中花子",
  "email": "[email protected]",
  "active": true
}

環境変数とファイル分離

# 環境変数ファイル(rest-client.env.json)
{
  "development": {
    "baseUrl": "https://api-dev.example.com",
    "accessToken": "dev-jwt-token",
    "userId": "12345"
  },
  "production": {
    "baseUrl": "https://api.example.com",
    "accessToken": "prod-jwt-token",
    "userId": "67890"
  },
  "local": {
    "baseUrl": "http://localhost:3000",
    "accessToken": "local-token",
    "userId": "test-user"
  }
}

# APIリクエストファイル(api-requests.http)
# @name login
POST {{baseUrl}}/auth/login HTTP/1.1
Content-Type: application/json

{
  "username": "{{username}}",
  "password": "{{password}}"
}

###

# @name getUsers  
GET {{baseUrl}}/users?page=1&limit=10 HTTP/1.1
Authorization: Bearer {{accessToken}}

###

# @name createUser
POST {{baseUrl}}/users HTTP/1.1
Authorization: Bearer {{accessToken}}
Content-Type: application/json

{
  "name": "新規ユーザー",
  "email": "[email protected]"
}

GraphQLクエリとミューテーション

# GraphQLクエリ
POST {{graphqlEndpoint}} HTTP/1.1
Authorization: Bearer {{graphqlToken}}
Content-Type: application/json

{
  "query": "query GetUserProfile($userId: ID!) { user(id: $userId) { id name email posts { id title content createdAt } } }",
  "variables": {
    "userId": "{{currentUserId}}"
  }
}

###

# GraphQLミューテーション
POST {{graphqlEndpoint}} HTTP/1.1
Authorization: Bearer {{graphqlToken}}
Content-Type: application/json

{
  "query": "mutation CreatePost($input: CreatePostInput!) { createPost(input: $input) { id title content author { name } } }",
  "variables": {
    "input": {
      "title": "新しい投稿",
      "content": "GraphQLで作成された投稿です",
      "authorId": "{{currentUserId}}"
    }
  }
}

ファイルアップロードとマルチパート

# ファイルアップロード(multipart/form-data)
POST {{baseUrl}}/upload HTTP/1.1
Authorization: Bearer {{accessToken}}
Content-Type: multipart/form-data; boundary=----boundary123

------boundary123
Content-Disposition: form-data; name="file"; filename="sample.txt"
Content-Type: text/plain

< ./files/sample.txt

------boundary123
Content-Disposition: form-data; name="description"

サンプルファイルのアップロード
------boundary123--

###

# バイナリファイルのアップロード
POST {{baseUrl}}/upload/image HTTP/1.1
Authorization: Bearer {{accessToken}}
Content-Type: image/png

< ./images/logo.png

###

# JSONとファイルの組み合わせ
POST {{baseUrl}}/posts HTTP/1.1
Authorization: Bearer {{accessToken}}
Content-Type: multipart/form-data; boundary=----boundary456

------boundary456
Content-Disposition: form-data; name="metadata"
Content-Type: application/json

{
  "title": "画像付き投稿",
  "tags": ["sample", "upload"]
}

------boundary456
Content-Disposition: form-data; name="image"; filename="post-image.jpg"
Content-Type: image/jpeg

< ./images/post-image.jpg
------boundary456--

認証パターンと設定

# Basic認証
GET {{baseUrl}}/protected HTTP/1.1
Authorization: Basic {{basicAuthToken}}

###

# Bearer Token認証
GET {{baseUrl}}/users HTTP/1.1
Authorization: Bearer {{jwtToken}}

###

# APIキー認証(Header)
GET {{baseUrl}}/data HTTP/1.1
X-API-Key: {{apiKey}}
Content-Type: application/json

###

# APIキー認証(Query Parameter)
GET {{baseUrl}}/search?q=example&api_key={{apiKey}} HTTP/1.1

###

# カスタムヘッダー
GET {{baseUrl}}/custom HTTP/1.1
Authorization: Bearer {{accessToken}}
X-Client-Version: 1.2.3
X-Request-ID: {{$guid}}
X-Timestamp: {{$timestamp}}
User-Agent: RestClient/1.0

プリプロセッシングとポストプロセッシング

# リクエスト前の変数設定
# @note テスト用のタイムスタンプを生成
POST {{baseUrl}}/events HTTP/1.1
Authorization: Bearer {{accessToken}}
Content-Type: application/json

{
  "eventType": "test",
  "timestamp": "{{$timestamp}}",
  "requestId": "{{$guid}}",
  "data": {
    "message": "テストイベント"
  }
}

###

# 動的な値を使用したリクエスト
# @note ランダムな値でテストデータを作成
POST {{baseUrl}}/users HTTP/1.1
Authorization: Bearer {{accessToken}}
Content-Type: application/json

{
  "name": "User-{{$randomInt 1000 9999}}",
  "email": "user{{$randomInt 100 999}}@example.com",
  "timestamp": "{{$datetime iso8601}}"
}

###

# レスポンスからの値抽出と再利用
# @name createSession
POST {{baseUrl}}/auth/sessions HTTP/1.1
Content-Type: application/json

{
  "username": "{{username}}",
  "password": "{{password}}"
}

###

# 前のレスポンスのセッションIDを使用
# @note createSessionのレスポンスからsessionIdを取得
GET {{baseUrl}}/profile HTTP/1.1
Authorization: Bearer {{createSession.response.body.sessionId}}