FastAPI接口get_my_user返回422错误,无参数传入却提示id问题
问题解决:GET /me接口返回422错误的原因与修复
问题根源
错误提示明确指出path中的id不是有效整数,这说明FastAPI把请求路径/me里的me当成了某个路由定义中的id路径参数,尝试将其转换为整数时失败,从而抛出422错误。
核心原因是:你的路由文件中存在一个定义在/me之前的、带有{id}路径参数的GET路由(比如@router.get('/{id}'))。FastAPI按路由定义顺序匹配请求,当请求/me时,会先匹配到带{id}的路由,把me当作id参数传入,而me无法转换为整数,就触发了类型错误。
改成POST请求正常,是因为POST版本的带{id}路由和/me的POST路由不会产生匹配冲突。
修复方案
调整路由定义顺序:把
/me的GET路由放在所有带{id}路径参数的GET路由之前。FastAPI会优先匹配先定义的路由,这样请求/me时就会正确匹配到get_my_user接口,不会被带{id}的路由拦截。
示例调整后的路由顺序:# 先定义/me路由 @router.get('/me', response_model=schemas.UserOut, status_code=status.HTTP_200_OK) def get_my_user(db: Session = Depends(get_db), current_user=Depends(oauth2.get_current_user)): user_data = get_user_data(current_user.id, db) if not user_data: return schemas.UserOut( message="User does not exist", status_code=status.HTTP_404_NOT_FOUND ) return user_data # 再定义带{id}的路由 @router.get('/{id}', response_model=schemas.UserOut) def get_user_by_id(id: int, db: Session = Depends(get_db)): # 对应接口逻辑 pass给带参数的路由添加前缀:如果调整顺序不方便,可以给带
{id}的路由添加特定前缀(比如/user/{id}),避免和/me这类固定路径的路由产生匹配冲突。
额外验证
你提到get_current_user在其他接口正常工作,这部分逻辑无需改动。调整路由顺序后,请求GET /me会正确调用get_my_user,使用current_user.id查询数据,不会再触发路径参数的类型错误。
内容的提问来源于stack exchange,提问作者notrayen
相关产品推荐
相关产品推荐

