FrontEnd

Orvalを使ってFastAPIが生成したOpenAPIからAPIクライアントを生成してみる

投稿日:

はじめに

orvalはOpenAPIからTypeScript用のAPIクライアントと、APIのリクエスト/レスポンスで使うオブジェクトやEnumの型定義を生成するツールです。
今回はorvalを使って、FastAPIが生成したOpenAPIからコード生成する導入方法と、カスタマイズしておいた方が良い点について紹介したいと思います。

orvalは以下のような特徴があります。

  • axiosに対応(既存のaxiosInstanceをそのまま使うことができるので、インターセプターを使った既存の仕組みもそのまま使用可能)
  • fetchにも対応(axiosである必要がない場合、容量を削減することができる)
  • Node.jsさえあればorvalを実行可能
  • APIクライアントのカスタマイズが容易
  • Tanstack Queryのコードを生成することも可能
  • MSW用のモックを生成できる

それでは、ここからはFastAPI + orvalの構成で説明していきます。

FastAPI側の準備

今回はサンプルとしてCRUDを用意します。(APIの定義さえあれば良いので処理はダミーとなっています。)

FastAPI側のポイントは2点です。

1点目は、 BaseSchema を定義し、それを継承して Pet を定義していることです。 BaseSchema ではリクエスト・レスポンスでキャメルケースを受けるために必要な設定をしています。
Pythonではスネークケースを使い、TypeScriptではキャメルケースを使いたいということはよくあると思います。その問題を解決するため、このような設定をしています。
この設定をすることで、FastAPIが出力するOpenAPI上もキャメルケースになってくれるため、orvalでの生成結果もキャメルケースにすることができます。

2点目は、 APIRouter を生成するときにタグを指定している点です。ここでタグを指定すると、 APIRouter に紐づくAPIには同じタグが振られるようになります。
orvalは出力ファイルをタグ単位で分割することができるので、そのために指定しています。

orvalのセットアップとコード生成

まずはorvalを追加します。orvalは実行時には不要なので、devDependencies に追加するようにします。

次に orval.config.ts ファイルを作成し、設定をしていきます。

ここで特におすすめなのが modeoperationName の設定です。
まず、 mode は出力するファイルをどのように分割するかを設定します。デフォルトは single となっていて1つのファイルに全て出力されます。
今回は tags-split となっていて、以下のようにタグごとにファイルが分けられます。(これが最も細かく分割されるモードです)

次に operationName のカスタマイズです。この設定をしない状態だと、以下のようなAPIクライアントが生成されます。

関数名がとてもわかりにくいものとなってしまっています。この関数名はデフォルトでOpenAPIの operationId から生成されますが、FastAPIが生成するOpenAPI以下のようになっていて、かなり分かりにくいものとなっています。

このOpenAPIを眺めてみると、 summary はFastAPIで定義した関数名が使用されていることに気が付きます。
このテキストであれば、APIクライアントの関数名に使用できそうです。ただし、このままでは使用できないため、以下のように、空白を除去し先頭を小文字にすることで、キャメルケースに変換した上で使用しています。

最後に、コマンド pnpm orval --config ./orval.config.ts を実行すればコードが生成されます。

生成されたコードの確認

まずは petstore.schemas.ts を見ていきます。このファイルにはAPIで使用するオブジェクトの型やEnumが定義されています。

このファイルで注目したい点は interface Pet の各フィールド名がキャメルケースとなっている点です。先ほど説明した通り、PydanticモデルのConnfigの設定が、FastAPIが出力するOpenAPIに反映されているため、orvalが生成するTypeSciprtの型もキャメルケースになりました。

次に、APIクライアントである pets/pets.ts を見ていきます。

このファイルで注目したい点は、各関数名です。先ほど orval.config.tsoperationName の生成をカスタマイズし、OpenAPIの summary から生成するようにしたので、分かりやすい関数名になっています。

さいごに

FastAPI + orvalの組み合わせの場合、双方の設定をカスタムすることで実用的なAPIクライアントを生成することができました。

おすすめ書籍

Reactハンズオンラーニング 第2版 ―Webアプリケーション開発のベストプラクティス プログラミングTypeScript ―スケールするJavaScriptアプリケーション開発

page_footer_responsive




-FrontEnd
-, , ,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

react-icon

[React初心者]カスタムフックについて学ぶ

1 はじめに2 Ract Hook(フック)とは3 カスタムフックの実装3.1 フックのルール3.2 カスタムフック3.3 カスタムフックの実装4 さいごに5 おすすめ書籍 はじめに 今回はReact ...

Go言語

Go WebAssemblyでPromiseを使って非同期化してみた

1 はじめに2 Go WebAssemblyで非同期化のコード3 Promise化する4 おまけ5 さいごに6 おすすめ書籍 はじめに 先日WebAssemblyに入門して、実際に以下のチュートリアル ...

Next.jsでJSON-LDを実装する

1 はじめに2 リッチリザルトとは3 構造化データとは4 Next.jsでJSON-LDを実装4.1 JSON-LDデータの作成4.2 JSON-LDデータの埋め込み5 リッチリザルトテスト6 さいご ...

js

WebページにGoogleMapを配置する

1 はじめに2 準備2.1 API Keyを取得する3 簡単な実装3.1 サンプルコード4 タップした位置にマーカを動かす4.1 サンプルコード5 場所を検索する5.1 サンプルコード6 画面例7 さ ...

Nuxt 3(ベータ)の新機能を紹介

1 はじめに2 Nuxt 3の特徴2.1 新しいサーバエンジン(Nitro Engine)が登場2.2 Vue 3&Composition APIのネイティブサポート2.3 TypeScriptのネイ ...

フォロー

blog-page_side_responsive

2025年6月
1234567
891011121314
15161718192021
22232425262728
2930  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。