Dans FastAPI, définition de plusieurs points de terminaison d'API avec le même paramètre de chemin mais différent les chemins ne sont pas simples. Comme l'ordre d'évaluation des points de terminaison est important, le point de terminaison défini en premier sera toujours déclenché, quel que soit le chemin spécifique de la requête.
Considérez le fichier de routeur suivant où trois points de terminaison sont définis, chacun avec un chemin différent mais partageant le paramètre de chemin "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, organisation_id : str, session : AsyncSession = Depends(get_db)) :</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><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_two(project_id : str, session : AsyncSession = Depends(get_db)) :
# ...
Ce code présente un comportement inattendu lorsque les points de terminaison de l'API 2 et 3 appellent la méthode du contrôleur définie dans le point de terminaison 1 (method_one ()).
Dans FastAPI, l'évaluation des points de terminaison se produit de manière séquentielle. Par conséquent, le point de terminaison 1 ("/project/{project_id}/{employee_id}") est évalué en premier. Lorsqu'une requête ultérieure est adressée au point de terminaison 2 ou au point de terminaison 3, FastAPI interprète la partie "/project/{project_id}" du chemin comme paramètre project_id pour le point de terminaison 1. Cela entraîne l'appel de la méthode du contrôleur pour le point de terminaison 1.
Pour résoudre ce problème, l'ordre de définition du point de terminaison doit être inversé afin que les points de terminaison avec le même paramètre de chemin soient définis avant le point de terminaison qui inclut un chemin supplémentaire paramètres :
</p> <h1>GET API Endpoint 2</h1> <p>@router.get("/project/details/{project_id} ")</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"># ...
@router.get("/project/metadata/{project_id}")
# ...
@router.get("/project/{project_id}/{employee_id}")
# ...
En effectuant cette modification, FastAPI évaluera d'abord les points de terminaison 2 et 3, en s'assurant que les méthodes de contrôleur appropriées sont exécutées lorsque des demandes sont adressées à ces points de terminaison.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!