前回、「Insomniaの3つのモードを触ってみる」という記事を書いたが、サンプルが最初からある程度作り込まれていたので、なぞってる感が強かった。
また、コンテナ環境が必要だったので人によってはハードルが高かったかもしれない。
今回はQiitaのAPIを題材にして、コンテナ不要、API仕様も作るところから確認して、ゼロベースで使い始めた場合どんな感じになるかを確認してみる。
なお前提として、Insomniaが既にインストール済みであるものとする。
プロジェクトの作成からAPI仕様の作成まで
Insomniaを立ち上げて、左サイドバーのPROJECTS
の+
を押して新規プロジェクトを作成する。
ここではQiitaAPIという名前にし、Localに保存する設定で作成した。
次にNew Document
をクリックしてドキュメントを作成する。
Create New Design Document
というダイアログが表示されるので、デフォルトのmy-spec.yaml
のままCreate
をクリックして空のSpecを作成する。
次にOpenAPIの仕様に従ってSpecを作成する。
(ただ、OpenAPIの仕様に関してはQiitaのOpenAPIのタグにまとまったいい感じの記事がいくつかあるので、仕様書をガッツリ読むよりはこちらをかい摘んで理解した方が学習効率は良さそう)
QiitaのAPIの仕様はここにまとまっている。
ここでは記事の取得(/api/v2/items, /api/v2/items/:item_id)と認証中のユーザー情報取得(/api/v2/items/authenticated_user)を実装してみる。
試しに書いてみたAPI仕様のYAMLが以下となる。
openapi: 3.1.0
info:
contact:
name: hoge
version: 0.1.0
title: Qiita API
description: |
Testing with Qiita API
servers:
- url: https://qiita.com/api/v2
description: Qiita API Endpoint
security:
- Bearer: []
tags:
- name: qiita
description: Qiita API
externalDocs:
url: https://qiita.com/api/v2/docs
paths:
/items:
get:
description: Get items
summary: Get items from Qiita
tags: ["qiita"]
operationId: "getitems"
responses:
"200":
description: Succeeded to get items
/items/{item_id}:
get:
description: Get specific item
summary: Get specific item from Qiita
tags: ["qiita"]
operationId: "getitemsid"
responses:
"200":
description: Succeeded to get items
parameters:
- name: item_id
in: path
required: true
description: The transaction id.
schema:
$ref: "#/components/schemas/item_id"
/authenticated_user:
get:
description: Get user info
summary: Get user info from Qiita
tags: ["qiita"]
operationId: "getuserinfo"
responses:
"200":
description: Succeeded to get user info
components:
schemas:
item_id:
type: "string"
description: "Item ID"
example: "cc33db7772886b9d0946"
securitySchemes:
Bearer:
type: http
scheme: bearer
description: Credentials or access token for API
下にNo lint problem
と表示されれば記載については問題ない。
また、右の仕様の画面でGET
のところから実際にAPIを発行することが出来る。
なお、認証に関しては設定していない場合、以下のように401が返ってくる。
認証部分はBearer(トークンによる認証)にしているので、トークンを取得してInsomnia上で設定しないと200にならない。
トークンはQiitaのアカウントがあればここから発行できる。
トークン発行後、InsomniaのAPI仕様の画面の上部にあるAuthorize
をクリックし、出てくるダイアログにトークンを貼り付けてAuthorize
をクリックすると認証した状態になる。(ダイアログは自動で閉じないのでClose
をクリックして閉じる)
その状態で再度実行すれば成功するようになる。
Collectionによる動作確認
先ほどまでの手順で動作確認は出来たが、以下のようなことが出来なかった。
- item_idを変えての動作確認
- 認証トークンの保持
ここではInsomniaのCollectionという機能を利用してよく投げるAPIのセットを定義する。
Collectionは自動生成機能があるので、まずこれを使ってベースとなるCollectionを作成する。
SPECの右のギアマークをクリックし、Generate collection
をクリックする。
すると、作成したリクエストごとに雛形が作成される。
ただ、可変部が_.base_url
や_.item_id
といった名前で変数化されており、このままでは利用できない。
これらは環境変数として定義できるため、それぞれ定義する。
Generate collection
でCollectionを作成すると、自動的に環境変数の箱が定義されるので、そこに追加する。
左上のBase environment
の横のギアマークをクリックする。
環境変数の一覧が表示されるが、ここでOpenAPI env qiita.com
というのがShared(他のプロジェクトメンバーと共有される)な環境変数として用意されていることがわかる。
これがGenerate collection
で追加された環境変数である。
この中の、scheme
, base_path
, host
は全環境で共通化できるのでコピーしてBase Environment
(全Collectionで共通の環境変数)に記載する。
またbase_url
はそれらの環境変数で定義できるため、環境変数を使って定義する。
{
"scheme": "https",
"base_path": "/api/v2",
"host": "qiita.com",
"base_url": "{{ _.scheme }}://{{ _.host }}{{ _.base_path }}",
}
なお、{{...}}
の部分は._
と入力すると候補が出てくるので、こういう書き方をしなくてもインタラクティブに入力することも出来る。
また、トークンは共有しない方がいいので、Privateな環境変数を別で作成する。
Base Environment
の右横の+
をクリックし、Privateな環境変数の箱を作成し、myenv
とリネームする。
中には以下のようにトークンとitem_id
を定義する。
{
"bearerToken": "567xxxxxxxxxxxxxxxxxx",
"item_id": "bf1a1aa9f2a609864e7e"
}
これでmyenv
を選択してGET _.base_url/authenticated_user
にアクセスするリクエストを投げると以下のように200を取得することが出来る。
テストの作成
最後にテストを作成する。上部のSPEC
COLLECTION
TESTS
の並びからTESTS
をクリックし、画面遷移後にNew test suite
をクリックするとテストスイートが作成できるので、Qiita Test Suite
という名前にリネームする。
テストスイート作成後、+ New test
をクリックするとテストの雛形が作成される。
Select a request
をクリックすると、Collection内のリクエストが選べるので、テスト対象を指定する。
ここではCollection内のリクエストそれぞれに対応する3つのテストを用意する。
テストを実行すると、おそらく全て問題なくPassするはずだ。
試しに環境変数myenv
内のbearerToken
を不正なものに書き換えて実行する。
失敗した。
なお、失敗した要因を確認したい場合はデバッグウィンドウを表示させるとよい。
View
->Toggle DevTools
をクリックすると、右にChromeのデバッグウィンドウが表示される。
console.log()
を使うとConsoleのところに任意の文字列を出したりすることが出来る。
expect()
の前にconsole.log()
でresponseの中身を除くようコードを変更する。
const response1 = await insomnia.send();
console.log(response1);
expect(response1.status).to.equal(200);
401の詳細が確認できた。
ということで、Insomniaを気軽に触って体験してみたい人は、とりあえずInsomniaをインストールして、身近なAPIを題材に触ってみると良いと思う。