2019-09-22

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 が出てしまう。

ついでに静的生成

使い方はこんな感じ。

npx openapi-generator generate -i path/to/api.json -g ruby

OpenAPI 3 対応

OpenAPI parser と名乗っているものが OpenAPI 3 対応し始めている。

今回は試してません。

About

例によって個人のなんちゃらです