😊

API BlueprintでAPI仕様書を書く

2022/03/21に公開

ツールが古すぎるのが玉に瑕

関連記事:
SwaggerでOpenAPI仕様書を作成、HTMLやMarkdownに変換する


みんな大好き仕様書の話

最近のサーバーサイドエンジニアはフロントAPIを作るのがメインの作業になってることが多い。
フロントはReactやVueだったりスマフォアプリだったり。

で、フロント側のエンジニアと会話をするときに必要なのがAPI仕様書。
箇条書きとかAPIの説明書などではAPIの中身はわかっても最終的にどういうデータが取れるかがわからない。
(口頭は論外)
そこでAPI仕様書を起こして入力値、出力値(型やフォーマットなども)を明確にする。

LaravelなどではLaravel API Documentation Generatorのようなコメントアウトに記述するタイプもあるが、
コードのコメントアウト部分が重たくなってコードが見辛くなる。

API仕様書で調べるとswaggerがまず見つかると思う。
API設計から仕様書策定、テスト、モックサーバーなど多機能ツールとなっている。
ただ、個人的には重厚すぎて扱いたくないレベル。

などもあるが、
それはまたの機会にし、
今回はAPI Blueprintで仕様書を作成していく。

以下のような特徴がある

  • Markdown記法
  • ドキュメント生成
  • モックサーバー機能
  • APIテスト機能

機能的には十分。
ただ、Oracleが買うと進化が止まる法則があって、
五年ぐらい進化していないところが残念。

あと、JsonAPIが前提の使用になっていて、
ちょっと変わったことをしようとすると苦労する。

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------

事前準備

ツールのインストール

npm i aglio drakov dredd

VSCode

VSCodeにAPI Blueprint用のプラグインがあるので、
それらをインストール

  • API Elements extension
  • API Blueprint Viewer

仕様書生成の流れ

仕様書作成

まずは簡単なクエリストリング付きGETリクエストを使って仕様書を書いてみる
拡張子 .apib のファイルを作成しマークダウン記法で記述する。
こんな感じのリクエストの場合
/message?page=2&limit=15

hello.apib
FORMAT: 1A

# API Blueprint

## ハロー・ワールド API

# Echo Hello [/message{?page,limit}]

## ハロー・ワールド取得API [GET]

+ Parameters
    + page: 2  (number, optional) - ページ数    
    + limit: 15  (number, optional) - 取得件数
        + Default: `20`

+ Response 200 (text/plain)

        Hello World!

(・ω・) クエリストリングの書き方が独特だなぁ。

ドキュメント生成

さて仕様書が書けたところで、
次は閲覧しやすいようにHTMLに変換する。
使用するツールはaglio

npx aglio -i hello.apib -o hello.html

ドキュメント生成すると以下のような感じ

(・∀・) 見やすい!

モックサーバー起動

ドキュメント作成目的だけでも十分だが、
他にも使い道がある。
その一つがモックサーバー機能で、
これは簡易の入出力サーバーと言えば良いか。

先ほど作成した仕様書通りのリクエストを投げると、
仕様書記載の通りの返答をしてくれる。
これを使ってAPIが実装前でもAPIを使用する前提のシステム構築を並行して行うことができる。

モックサーバー機能のツールはdrakov

npx drakov -p 3002 -D 1 -f hello.apib
 [INFO] No configuration files found
 [INFO] Loading configuration from CLI
   DRAKOV STARTED   
 [LOG] Setup Route: GET /message ハロー・ワールド取得API
   Drakov 2.0.1      Listening on port 3002

サーバー起動した状態でcurlを叩いてみると

curl localhost:3002/message -H 'Content-Type: text/plain'
  Hello World!

(・∀・)」仕様書通り!

APIテスト実行

実際にリクエストを投げてテストを実行する機能。
使うツールはdredd

先ほどのモックサーバーを起動したまま以下のコマンドを実行してみると

npx dredd .\hello.apib http://localhost:3002
(node:8336) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
fail: GET (200) /message?page=2&limit=10 duration: 111ms
info: Displaying failed tests...
fail: GET (200) /message?page=2&limit=10 duration: 111ms
fail: headers: At '/content-type' No enum match for: "text/plain; charset=utf-8"

戻り値が text/plain じゃなくて text/plain; charset=utf-8 が返ってきてるってエラー。

(・ω・) 細かいなぁ・・・。

上記エラーに基づいて仕様書を調整

hello.apib
- + Response 200 (text/plain)
+ + Response 200 (text/plain; charset=utf-8)

他にもPOSTやPUTなどの別のリクエスト、
HTTP Form、json API、JSON-Rpcなど様々なスタイルに対応できそう。
記述方法は別記事にしようと思う。

------------------- ↓ 後書はここから ↓-------------------

冒頭に書いたが、
aglio, drakov, dreddともに更新が止まっている。
aglioに至っては5年前で止まっている。(令和4年2月23日現在)

仕様が進化しなければ、
やることは大きく変わらないので、
ツールが進化しないのも仕方が無いが、
nodeのバージョンが新しいと、
インストールが難しくなる問題がでてくる。

最近ではdocker経由で使用する例も増えているようだ。
ツールはもう少し深掘りが必要かもしれない。

swaggerを使う

(令和4年9月14日追記)
流石にツールが古くなりすぎたので、
改めて仕様書を書く方法考えた。

SwaggerでOpenAPI仕様書を作成、HTMLやMarkdownに変換する

Discussion