FastAPI で、同じパス パラメータで異なる複数の API エンドポイントを定義する道は単純ではありません。エンドポイント評価の順序が重要であるため、リクエストの特定のパスに関係なく、最初に定義されたエンドポイントが常にトリガーされます。
次のルーター ファイルについて考えてみましょう。ここで 3 つのエンドポイントが定義されており、それぞれ異なるパスを持ちますが、「project_id」パス パラメーターを共有しています:
</p> <h1>GET API Endpoint 1</h1> <p>@router.get("/project/{project_id}/{employee_id}")<br>async def method_one(project_id: str,organization_id: str, session: AsyncSession = depends(get_db)):</p> <pre class="brush:php;toolbar:false"># ...
@router.get("/project/details/{project_id}")
async def method_two(project_id: str, session: AsyncSession = depends(get_db) )):
# ...
@router.get("/project/metadata/{project_id}")
async def method_three(project_id: str, session : AsyncSession = depends(get_db)):
# ...
このコードは、API エンドポイント 2 および 3 がエンドポイント 1 で定義されたコントローラー メソッド (method_one) を呼び出すときに予期しない動作を示します。 ()).
FastAPI では、エンドポイントの評価は順番に行われます。したがって、エンドポイント 1 (「/project/{project_id}/{employee_id}」) が最初に評価されます。後続のリクエストがエンドポイント 2 またはエンドポイント 3 に対して行われると、FastAPI はパスの「/project/{project_id}」部分をエンドポイント 1 の project_id パラメーターとして解釈します。これにより、エンドポイント 1 のコントローラー メソッドが呼び出されます。
この問題を解決するには、エンドポイント定義の順序を逆にして、同じパス パラメーターを持つエンドポイントが追加のパスを含むエンドポイントの前に定義されるようにする必要があります。パラメータ:
</p> <h1>GET API エンドポイント 2</h1> <p>@router.get("/project/details/{project_id} ")</p> <pre class="brush:php;toolbar:false"># ...
@router.get("/project/metadata/{project_id}")
# ...
@router.get("/project/{project_id}/{employee_id}")
# ...
この変更を行うことで、FastAPIは最初にエンドポイント 2 と 3 を評価し、それらのエンドポイントにリクエストが行われたときに適切なコントローラー メソッドが実行されるようにします。
以上がFastAPI で同じパス パラメーターを使用して複数の API エンドポイントを定義するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。