RubyでOpenAPI clientの動的生成させてみた
OpenAPI に対応してる API の client 側を触る機会ができたのでせっかくならということで client の動的生成させてみた。本当はクライアントサイドは Ruby より JavaScript とかの方が充実しているような気がしないでもないけど、一応第一言語なので、悩むことが少なくていいんじゃないかと思って試してみた。
動的生成
notonthehighstreet/svelte: Dynamic Ruby API Client from Swagger JSON Spec
Svelte::Sevice.create(module_name: <NAME>, (url|json): <String>)
と呼ぶと、
Svelte::Sevice::NAME
という Module が生成される。ここ以下の名前空間に OpenAPI の path に応じた module がどんどんできていく。最終的には
Module::Path::To::Resource.operation_id_to_snake_case
みたいなメソッドができあがる。これを call すると、API を叩ける。他の option で大事なのはたぶん
- options
- protocol
- auth
辺り。
とにかく OpenAPI の JSON を読みながら module を掘り、メソッドを call していくことができる。なるほどこれは便利だ。
課題
auth option を create 時に与えるのはよい手ではない。
Svelte は Service Options ( create 時の option ? ) として auth を受け取るが、 例えば token で認証を行う場合には expire 期間を設けることもよくあるのに create 時に与える必要があるため、認証エラーが返ってきたら生成した client を破棄して create し直す処理を client を利用する側に作り込む必要がある。
そして create し直すとそれは Constant の再定義になるので必ず Warning が出てしまう。
ついでに静的生成
- interagent/heroics: Ruby HTTP client for APIs represented with JSON schema
- 試してない
- OpenAPI Generator · Generate clients, servers, and documentation from OpenAPI 2.0/3.x documents
- かなりのコードが生成されるし、手元の環境を思いっきり汚してくるので慎重に使うこと。
使い方はこんな感じ。
npx openapi-generator generate -i path/to/api.json -g ruby
OpenAPI 3 対応
OpenAPI parser と名乗っているものが OpenAPI 3 対応し始めている。
- https://github.com/kevindew/openapi3_parser
- https://github.com/ota42y/openapi_parser
- https://github.com/braintree/open_api_parser
今回は試してません。