こんにちは。システム開発推進部の牛崎です。
Web API開発で最初に考えたいIF定義。昨今はREST API定義を記述するOAS (OpenAPI Specification)が登場し、テキストベースで手軽にIF定義を編集出来るようになりました。以前はSwaggerと呼ばれていたものです。OASのIF定義で真っ先に懸念されるのが肥大化で、作成経験のある方はIF定義の分割・統合を考えたことがあるのではないでしょうか?
僕の所属するGX推進グループは、今後Web APIとのお付き合いが長くなるはず。OASどのようにIF定義を分割・統合すると楽そうか? 検討・検証をしてみました。
まずは統合の雰囲気を知ろう
OAS編集ツールのStoplight Studioを使ってみましょう。 プロジェクト新規作成からチュートリアルプロジェクトを作成可能です。このプロジェクトのディレクトリ構造を参考に進めます。
. |-- assets | `-- images | `-- studio-overview.png |-- docs | |-- introduction.md | |-- markdown | | |-- basic-syntax.md | | `-- stoplight-flavored-markdown.md | `-- ui-overview.md `-- reference |-- common | |-- models | | `-- error.v1.yaml | `-- openapi.v1.yaml |-- petstore | |-- models | | |-- category.v1.yaml | | `-- pet.v1.yaml | `-- openapi.v1.yaml `-- todos |-- models | |-- todo-full.v1.json | |-- todo-partial.v1.json | `-- user.v1.json `-- openapi.v1.json
reference以下に機能グループでpetstoreとtodosに分けられ、それぞれにIF定義本体のopenapi.v1.yaml (json)があります。 これらの機能グループがまとまって1つのアプリケーションになると仮定し、2つのIF定義を統合して1つにしてみましょう。
ルートとなるIF定義として./reference/openapi.v1.yaml、統合後のIF定義を出力するディレクトリとして./reference/bundleを作成。
. `-- reference |-- bundle `-- openapi.v1.yaml
./reference/openapi.v1.yamlにpetstoreとtodosのIFを参照で記載して、swagger-cliを実行してみます。
$ cd reference $ swagger-cli bundle -o ./bundle/openapi.v1.yaml -t yaml ./openapi.v1.yaml
./referenence/bundle/openapi.v1.yamlが出力され、各機能グループに定義されたIFが統合されました。一安心 (^^; ※1 ※1 よく見たらpetstoreがOAS v3.x・todosがOAS v2.xだったので正常動作しないのではないかと...
次は分割・統合してみよう
petstoreのopenapi.v1.yamlはIFが2つのみですが、全体は92行。全体を見渡すのに不便ですし、これだけでも肥大化しやすいと分かります。
大部分を占めるpathsセクションを分割して、スリムにしてみましょう。 分割したpathsを配置するディレクトリ./reference/petstore/pathsと、petstoreの統合後IF定義を出力するディレクトリ./reference/petstore/bundleを作成。
. |-- bundle |-- models | |-- category.v1.yaml | `-- pet.v1.yaml |-- openapi.v1.yaml `-- paths |-- paths.pets.by-petId.yaml `-- paths.pets.yaml
./reference/petstore/openapi.v1.yamlのpathsは、pathsディレクトリ以下の各IF定義を参照とし、統合してみます。
$ cd ./reference/petstore $ swagger-cli bundle -o ./bundle/openapi.v1.yaml -t yaml ./openapi.v1.yaml
petstoreのIF定義が統合されました。
最後に、ルートとなる./reference/openapi.v1.yamlがpetstoreの参照先を統合後のIF定義に変更し、こちらも再統合してみましょう。 正常に統合できました。ヤッタネ!!
まとめ
今回は以下の分割・統合の流れを試しました。複数機能グループを1ファイルに統合する運用とするなら、現実的に使えそうな気がします。
- 中間成果物として機能毎に統合IF定義を出力する
- 中間成果物を統合してルートIF定義を出力する
皆さんもIF定義を楽しく進めて、良いWeb APIライフを!!