I am creating 2 GET methods for a resource student
using FastAPI. I'm looking to GET a student
in 2 ways: by student_id
or by student_name
.
The issue is that, I initially created the 2 endpoints as follows
@app.get("/student/{student_name}", response_model=schemas.Student, status_code=200)def get_student_by_name(student_name: str, db: Session = Depends(get_db)): db_student = crud.get_student_by_name(db, student_name) if db_student is None: raise HTTPException(status_code=404, detail="Student not found") return db_student@app.get("/student/{student_id}", response_model=schemas.Student, status_code=200)def get_student_by_id(student_id: int, db: Session = Depends(get_db)): db_student = crud.get_student_by_id(db, student_id) if db_student is None: raise HTTPException(status_code=404, detail="Student not found") return db_student
The problem is that the endpoint names are conflicting with each other, it is both /student
followed by a parameter and only one of them could work - in this case only /student/{student_name}
because it is defined in the front. So I came up with this simple workaround by adding a bit more to the endpoint names:
@app.get("/student/{student_name}", response_model=schemas.Student, status_code=200)def get_student_by_name(student_name: str, db: Session = Depends(get_db)): db_student = crud.get_student_by_name(db, student_name) if db_student is None: raise HTTPException(status_code=404, detail="Student not found") return db_student@app.get("/student/byid/{student_id}", response_model=schemas.Student, status_code=200)def get_student_by_id(student_id: int, db: Session = Depends(get_db)): db_student = crud.get_student_by_id(db, student_id) if db_student is None: raise HTTPException(status_code=404, detail="Student not found") return db_student
I added /byid
to the endpoint name of the get_student)by_id
method. While both endpoints could work now, I am wondering if this is considered a good practice? WHat would be the best practice when one resource needed to be queried with a single path parameter to differentiate the endpoint names?