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アプリケーション開発

blog-page_footer_336




blog-page_footer_336




-FrontEnd
-, , ,

執筆者:

免責事項

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


comment

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

CAPTCHA


関連記事

もうすぐ登場!Vue 3の変更点まとめ

1 はじめに2 仕様変更2.1 複数のv-modelが定義可能に2.2 template直下に複数のタグを記述可能に2.3 開始処理がcreateAppに2.4 scoped cssの仕様変更2.5 ...

Next.js 入門してみた

1 はじめに1.1 なぜNext.jsなのか?2 Next.jsとは何か2.1 Static Site Generation (SSG)2.1.1 Incremental Static Regener ...

react-icon

React QueryのSuspese Modeを使ってみた! [TypeScript]

1 はじめに2 React Suspenseとは3 React QueryのSuspense Mode3.1 事前準備3.2 Suspenseモードの有効化3.3 データをフェッチするコンポーネントの ...

react-icon

Vite 3を使ってみた

1 はじめに2 なぜViteは早いのか2.1 Native ESMの活用2.2 esbuildによる事前バンドル3 Viteのセットアップ3.1 Reactテンプレートでのセットアップ3.2 vite ...

Vue 3とVuex 4とTypeScriptでタイプセーフに開発する

1 はじめに1.1 インストール1.2 Storeの設定2 Storeの作成3 StoreをComponentから使用する4 $storeプロパティに型をつける5 さいごに6 おすすめ書籍 はじめに ...

フォロー

blog-page_side_responsive

2025年6月
1234567
891011121314
15161718192021
22232425262728
2930  

アプリ情報

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