FastAPI の OpenAPI 定義の operationId をシンプルにする
やりたいこと
FastAPI で生成される OpenAPI Spec の operation_id はデフォルトでパス名 + ルート名 ( API の関数名) で構成される。
e.g. api_v1_users_list_users
これだと Orval 等の API クライアント生成ツールで生成される関数名が長くなったりする。
e.g. getApiV1UsersListUsers
OpenAPI Specification の operationId のサンプル を見た感じ、OAS 内で operationId が一意になればパスを含める必要はないのでomitしたい。
参考
Path Operationの高度な設定 - FastAPI
作成したコード
code: routes/users.py
from fastapi.routing import APIRoute
from pydantic import BaseModel
router = APIRouter(prefix="/users")
class User(BaseModel):
id: str
name: str
@router.get("/")
def list_users() -> listUser:
return User(id="john_doe", name="John Doe") # mock response
code: main.py
from fastapi import FastAPI
from .routes import users
app = FastAPI()
app.include_router(users.router)
def simplify_operation_ids(api: FastAPI) -> None:
for route in api.routes:
if isinstance(route, APIRoute):
route.operation_id = route.name # operationId をルート名のみにする
simplify_operation_ids(app)
code: bash
$ uvicorn main:app --reload
# http://localhost:8000/openapi.json を開いて operationId を確認する
あとがき
rikuyam.icon は OpenAPI Spec に精通していないが、 GitHub REST API の OpenAPI Spec や Stripe API の Open API Spec を見た感じ、概ね良いと思う。
あと、Orval で生成されるクライアント名がいい感じになったのでよし。
#技術系_TIPS #2024-02