RestClientのススメ
APIをとりあえず叩いて確認したいときがありますが、今まではcurlだったりPostmanだったりを使っていました。
ただわざわざそれだけのためにPostman起動するのも面倒だし、curlはちょっと複雑なAPIになると少し不便です。
なんかいいのないかなーと色々試してみた結果、最近はVSCodeのRestClientに落ち着いています。
REST Client - Visual Studio Marketplace
.http
または .rest
という拡張子のファイルにリクエストを定義しておくと簡単にリクエストを飛ばせる、といったような拡張です。
構文としては次のような感じ
GET http://XXX.ap-northeast-1.elb.amazonaws.com/users HTTP/1.1
最後のHTTP/1.1は省略可能。
せっかくなのよく使う機能を紹介してみる。
- POSTでJSON飛ばしたい
- 複数のリクエストを定義したい
- 変数定義したい
- レスポンスの値を取得したい
- multipartでファイルアップロードしたい
- Basic認証
- GraphQLリクエストを飛ばしたい
- UUIDやランダムな数字を付与したい
POSTでJSON飛ばしたい
POST http://XXX.ap-northeast-1.elb.amazonaws.com/users Content-Type: application/json { "name": "lunastera" }
複数のリクエストを定義したい
###
で区切れば別リクエストとして定義できます。
GET http://XXX.ap-northeast-1.elb.amazonaws.com/users ### GET http://XXX.ap-northeast-1.elb.amazonaws.com/entries
変数定義したい
@変数名 = 値
のようなシンタックス。
@url = http://XXX.ap-northeast-1.elb.amazonaws.com @name = lunastera POST {{url}}/users Content-Type: application/json { "name": "{{name}}" }
なんかこの書き方するとbodyの変数展開が赤く表示されてダメそうに見えるけど普通に通ります。
変数はどこで参照されているかも見れるので便利。
個人的には scheme, host, port, boundary
辺りをよくトップに定義しています。
ただトップに定義した場合、使用されている場所が自明だとしても n reference
のようなCodeLensが表示されまくって逆に見づらくなったりするので、トップにschemeを定義して1行開ける、というような使い方をしています。
@scheme = https @host = XXX.ap-northeast-1.elb.amazonaws.com @port = 443 @url = {{scheme}}://{{host}}:{{port}} @boundary = ----ExampleBoundary
レスポンスの値を取得したい
これがとにかく便利。
例えば
GET {{url}}/entries/1
というリクエストを飛ばして
{ "title": "タイトル", "content": "コンテンツ" }
のようなレスポンスが帰ってくる時、
# @name entry1 GET {{url}}/entries/1 @title = {{entry1.response.body.$.title}}
のような定義をして上記リクエストを飛ばすと @title
に タイトル
という文字列が入ります。便利!
multipartでファイルアップロードしたい
@boundary = ----Boundary POST {{url}}/upload Content-Type: multipart/form-data; boundary={{boundary}} --{{boundary}} Content-Disposition: form-data; name="input"; filename="data.csv" Content-Type: text/csv < /path/to/path/data.csv --{{boundary}}--
< ファイルへのパス
と記述することで任意のファイルを指定できます。
Basic認証
GET {{url}}/login Authorization: Basic dXNlcjpwYXNzd2Q=
スペース区切りでusernameとpasswordを記述すると自動でBase64エンコーディングしてくれます。
GET {{url}}/login Authorization: Basic user pass
GraphQLリクエストを飛ばしたい
POST {{url}}/graphql Content-Type: application/json Authorization: Bearer xxx X-REQUEST-TYPE: GraphQL query ($name: String!) { ... } { "name": "lunastera" }
UUIDやランダムな数字を付与したい
{{$guid}}
や{{$randomInt min max}}
といった動的な特殊変数があるのでこの辺使いましょう。