763
698

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Visual Studio CodeAdvent Calendar 2017

Day 20

VS Code上でHTTPリクエストを送信し、VS Code上でレスポンスを確認できる「REST Client」拡張の紹介

Last updated at Posted at 2017-12-19

概要

  • Visual Studio Code(以下VS Code)の拡張機能であるREST Clientが便利だったのでその紹介です。
  • 使い方を文字とgifで説明していきます。
  • 説明はマーケットプレース以上の情報を足していないので、英語に抵抗がなければ公式ページを照会してください。

REST Clientとは

VS Code上でHTTPリクエストを送信し、VS Code上でレスポンスを確認できるVS Codeの拡張機能です。

マーケットプレースのREST Clientのページでインストールボタンをクリックするか、VS Codeの拡張機能アイコンをクリックして「REST Client」を検索してインストールボタンをクリックするかで使用できます。

拡張機能検索

文字だけではイメージし辛いかもしれないので、gifで見てみましょう。

samplerequest2.gif

左側のタブがリクエスト、右側のタブがレスポンスです。

ブラウザの拡張機能を使うでもなく、ターミナルでたたくでもなく、スタンドアローンなソフトを使うでもなく、エディタ上でリクエスト・レスポンスが完結してしまいます。

しかも、使い方さえ知れば色々な形式のリクエストをテストしたり、設定を読み込んだりできます。

使い方

基本的なHTTPリクエスト

GET

https://example.com/comments/1

Windows: Ctrl + Alt + R
Mac: Cmd + Alt + R

または

F1 -> Send Request

でリクエストを送信できます。

POST

POST https://example.com/comments HTTP/1.1
content-type: application/json

{
    "name": "sample",
    "time": "Wed, 21 Oct 2015 18:27:50 GMT"
}

Windows: Ctrl + Alt + R
Mac: Cmd + Alt + R

または

F1 -> Send Request

で同様にリクエストを送信できます。リクエストヘッダから1行空けてリクエストボディを書きます。

複数行リクエスト

1ファイル内で複数のリクエストを書いておくことができ、 ### で区切ります。送信したいリクエストのブロックにカーソルを置き、

Windows: Ctrl + Alt + R
Mac: Cmd + Alt + R

または

F1 -> Send Request

でリクエストを送信できます。

同時にリクエストを送信できるというわけではありません。

GET https://example.com/comments/1 HTTP/1.1

###

GET https://example.com/topics/1 HTTP/1.1

###

POST https://example.com/comments HTTP/1.1
content-type: application/json

{
    "name": "sample",
    "time": "Wed, 21 Oct 2015 18:27:50 GMT"
}

リクエスト行

標準通り メソッド パス名 HTTP/バージョン の形式です。省略も可能で、メソッドを省略すると GET になります。

GET https://example.com/comments/1 HTTP/1.1
GET https://example.com/comments/1
https://example.com/comments/1

クエリストリング

こちらも特別なことはないですが、?&で改行できます。

GET https://example.com/comments?page=2&pageSize=10
GET https://example.com/comments
    ?page=2
    &pageSize=10

リクエストヘッダー

下記のようにリクエスト行直下から最初の空行まではリクエストヘッダとみなされます。

https://example.com/comments/1
User-Agent: rest-client
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6,zh-CN;q=0.4
Content-Type: application/json

User-Agentを指定しなければvscode-restclientが自動で設定されます。デフォルト値はrest-client.defaultuseragentで変更できます。

リクエストボディ

リクエストヘッダに1行あけて書きます。

POST https://example.com/comments HTTP/1.1
Content-Type: application/xml
Authorization: token xxx

<request>
    <name>sample</name>
    <time>Wed, 21 Oct 2015 18:27:50 GMT</time>
</request>

リクエストボディはファイルから読み込むこともできます。

POST https://example.com/comments HTTP/1.1
Content-Type: application/xml
Authorization: token xxx

< ./demo.xml

ファイルパスは上記のような相対パスも < C:\Users\Default\Desktop\demo.xml のような絶対パスにも対応しています。

multipart/form-data

こう書きます。

POST https://api.example.com/user/upload
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="text"

title
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="image"; filename="1.png"
Content-Type: image/png

< ./1.png
------WebKitFormBoundary7MA4YWxkTrZu0gW--

cURLリクエスト

cURLを生で書いて実行することも可能です。ただ、現在サポートされているのは下記のオプションです。

  • -X, --request
  • -L, --location, --url
  • -H, --header(no @ support)
  • -b, --cookie(no cookie jar file support)
  • -u, --user(Basic auth support only)
  • -d, --data, --data-binary

リクエストをcURLとしてコピーする

REST Client方式で書いたHTTPリクエストからcURL用の文字列を生成できます。

F1で検索Windowsを開き、Copy Request As cURLを検索してクリックするとcURLのための文字列がクリップボードにコピーされた状態になります。

copyascurl.gif

リクエストのキャンセル

Windows: Ctrl + Alt + K
Mac: Cmd + Alt + K

もしくは

F1 -> Rerun Last Request

でリクエストをキャンセルできます。

リクエスト履歴

直近のリクエスト履歴50件を見て、そのリクエストを再送信できます。

Windows: Ctrl + Alt + H
Mac: Cmd + Alt + H

もしくは

F1 -> Rerun Last Request

レスポンスの保存

レスポンスのタブで画面右上の保存アイコンを選択するとファイルを開くかレスポンスファイルのフルパスをコピーするか選択できます。

ressavemini.gif

保存場所は /Users/user-name/.rest-client/responses/raw/ フォルダで、拡張子はhttpです。

また、すぐ右隣のアイコンをクリックするとレスポンスのボディだけファイルに保存できます。

保存場所は /Users/user-name/.rest-client/responses/body/ フォルダで、拡張子はhtmlです。

認証

Basic認証、Digest認証、SSLクライアント証明書認証に対応しています。

Basic認証

base64エンコード形式、ユーザ名 + パスワード形式のいずれにも対応しています。

GET https://httpbin.org//basic-auth/user/passwd HTTP/1.1
Authorization: Basic dXNlcjpwYXNzd2Q=
GET https://httpbin.org//basic-auth/user/passwd HTTP/1.1
Authorization: Basic user passwd

Digest認証

こう書きます。

GET https://httpbin.org/digest-auth/auth/user/passwd
Authorization: Digest user passwd

SSLクライアント証明書認証

PFXPKCS12PEM形式の証明書に対応しています。

設定は次のように書きます。

"rest-client.certificates": {
    "localhost:8081": {
        "cert": "/Users/demo/Certificates/client.crt",
        "key": "/Users/demo/Keys/client.key"
    },
    "example.com": {
        "cert": "/Users/demo/Certificates/client.crt",
        "key": "/Users/demo/Keys/client.key"
    }
}

PFXPKCS12の場合、次のように書きます。

"rest-client.certificates": {
    "localhost:8081": {
        "pfx": "/Users/demo/Certificates/clientcert.p12",
        "passphrase": "123456"
    }
}

各設定項目の意味は次の通りです。

  • cert: x509証明書へのパス
  • key: 秘密鍵へのパス
  • pfx: PKCS12PFX証明書へのパス
    passphrase: パスフレーズ(必要な場合のみのオプション)

各言語HTTPクライアントコードの生成

組み立てたHTTPリクエストを送信するためのクライアントコードを生成してくれるという機能が付いています。これはびっくりですね!

Windows: Ctrl + Alt + C
Mac: Cmd + Alt + C

または

F1 -> Generate Code Snippet

で言語を選択してください。

snipet.gif

「HTTP言語」

次の条件を満たすとシンタックスハイライト、コード補完等のサポートが受けられます。

  • ファイルの拡張子を.http.restにする
  • ファイルの最初の行をRFC 2616に基づくMethod SP Request-URI SP HTTP-Version のフォーマットの標準リクエストにする

コード補完

下記が対象です。

  • HTTP メソッド
  • リクエスト履歴からのHTTP URL
  • HTTPヘッダ
  • グローバル変数
  • 現在の環境/ファイル範囲のカスタム変数
  • AcceptContent-TypeヘッダのMIMEタイプ
  • Basic と Digest 方式の認証スキーム

コードジャンプ

Windows: Ctrl + Shift + O
Mac: Cmd + Shift + O

または

F1 -> @

でリクエストや変数にコードジャンプできます。

変数

グローバル変数とカスタム変数をサポートしています。それぞれで同一の変数が定義されている場合、カスタム変数が優先されます。

カスタム変数

こんな感じでHTTPリクエストと同一のファイル内に書きます。

@name = Huachao Mao
@id = 313
@address = Wuxi\nChina

###

@token = Bearer e975b15aa477ee440417ea069e8ef728a22933f0

GET https://example.com/api/comments/1 HTTP/1.1
Authorization: {{token}}

###

PUT https://example.com/api/comments/{{id}} HTTP/1.1
Authorization: {{token}}
Content-Type: application/json

{
    "name": "{{name}}",
    "address": "{{address}}"
}

構文は次のとおりです。

  • 変数名にスペースを含めてはいけません
  • 変数値の先頭と末尾のスペースは無視されます
  • エスケープはバックスラッシュ(\)を使用します
  • 変数はファイル内のどこに書いても大丈夫ですが、リクエストと同じブロック('###' の中)に書く場合はリクエストとの間に空行が必要です。

環境毎に切り替える

設定ファイルを書くことで、環境毎にHTTPリクエストファイル内で読み込む変数を切り替えることができます。

環境の切り替えはエディタの下部の環境名をクリックするか、次のコマンドで切り替えることができます。

Windows: Ctrl + Alt + E
Mac: Cmd + Shift + E

または

F1 -> Switch Environment

設定ファイルは下記のように書きます。

"rest-client.environmentVariables": {
    "$shared": {
        "version": "v1"
    },
    "local": {
        "version": "v2",
        "host": "localhost",
        "token": "test token"
    },
    "production": {
        "host": "example.com",
        "token": "product token"
    }
}

$shared という変数は全ての環境に適用されますが、上書きできます。

上記設定ファイルに対応するHTTPリクエストは下記のようになります。

GET https://{{host}}/api/{{version}comments/1 HTTP/1.1
Authorization: {{token}}

設定場所はユーザ設定ですが、

Windows: Ctrl + ,
Mac: Cmd + ,

または

F1 -> ユーザー設定を開く

でたどれます。

envmini.gif

グローバル変数

あらかじめ定義され、値が動的に変わる変数群です。

次のように使用します。

@token = Bearer fake token

POST https://{{host}}/comments HTTP/1.1
Content-Type: application/xml
X-Request-Id: {{token}}

{
    "request_id": "{{$guid}}",
    "updated_at": "{{$timestamp}}",
    "created_at": "{{$timestamp -1 d}}",
    "review_count": "{{$randomInt 5, 200}}"
}

{{$variableName}}のように使用し、下記が定義されています。

  • {{$guid}}: RFC 4122 v4 UUIDを返します
  • {{$randomInt min max}}: min以上mac未満のランダムな値を返します
  • {{$timestamp}}: UTC timestampを返します。{{$timestamp number option}}という形式です。たとえば、3時間前なら{{$timestamp -3 h}}明後日なら{{$timestamp 2 d}}となります。

{{$timestamp}}のオプションは次のとおりです。

Option Description
y Year
Q Quarter
M Month
w Week
d Day
h Hour
m Minute
s Second
ms Millisecond

レスポンスの見た目の設定

デフォルトでレスポンスはフル(ステータス行、ヘッダ、ボディ)の全てが表示されますが、変更できます。

Option Description
full デフォルトはこれで、すべてのレスポンスが表示されます
headers ステータス行とヘッダが表示されます
body ボディだけが表示されます
exchange リクエスト・レスポンスの両方が表示されます

ユーザー設定

Option Description Default
rest-client.followredirect HTTP 3xx レスポンスをリダイレクトとして扱います true
rest-client.defaultuseragent リクエストヘッダーでUser-Agentヘッダーが省略されている場合、リクエストごとにユーザーエージェントとして追加されます vscode-restclient
rest-client.timeoutinmilliseconds ミリ秒単位のタイムアウト時間で、0は無制限を表します 0
rest-client.showResponseInDifferentTab レスポンスを別タブで表示します false
rest-client.rememberCookiesForSubsequentRequests レスポンス時にSet-CookieヘッダーからCookieを保存し、後続のリクエストに使用します true
rest-client.enableTelemetry 匿名の使用データを送信します true
rest-client.excludeHostsForProxy プロキシ設定を使用する際除外するホスト []
rest-client.fontSize レスポンスプレビューで使用されるフォントサイズをピクセル単位で制御します 13
rest-client.fontFamily レスポンスプレビューで使用されるフォントファミリを制御します MenloMonacoConsolas"Droid Sans Mono""Courier New"monospace"Droid Sans Fallback"
rest-client.fontWeight レスポンスプレビューで使用されるフォントの太さを制御します normal
rest-client.environmentVariables 環境とカスタム変数を設定します(例 {"production": {"host": "api.example.com"}, "sandbox":{"host":"sandbox.api.example.com"}}) {}
rest-client.mimeAndFileExtensionMapping 保存されたレスポンスボディのMIMEタイプとファイル拡張子のカスタムマッピングを設定します {}
rest-client.previewResponseInUntitledDocument trueに設定されている場合は、無題のドキュメントでレスポンスをプレビューし、それ以外の場合はHTMLビューで表示します false
rest-client.previewResponseSetUntitledDocumentLanguageByContentType 新しいタブで各レスポンスを表示する際にContent-Typeヘッダに基づいてドキュメント言語を自動的に設定します false
rest-client.includeAdditionalInfoInResponse プレビューが無題のドキュメントを使用するように設定されている場合は、リクエストURLや応答時間などの追加情報を含めます false
rest-client.certificates 異なるホストの証明書パスです。 パスは絶対パスまたは相対パス(ワークスペースまたは現在のhttpファイルから) {}
rest-client.useTrunkedTransferEncodingForSendingFileContent リクエスト本文としてファイルコンテンツを送信するための転送エンコーディングの使用 true
rest-client.suppressResponseBodyContentTypeValidationWarning レスポンスボディのコンテンツタイプの検証を抑制します false
rest-client.previewOption レスポンスプレビューの出力オプションです。オプションの詳細は、上記のとおりです full

VSCode向けにhttp.proxyhttp.proxyStrictSSLのプロキシ設定が行われているとそれを反映します。

変更履歴

CHANGELOG

Q&A、issue上げ、コントリビューション

vscode-restclient

  • TypeScript: 97.4%
  • CSS: 2.6%
763
698
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
763
698

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?