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飛ばしたい

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}}といった動的な特殊変数があるのでこの辺使いましょう。