如何在FastAPI的Swagger表单中以JSON格式发送凭证?
解决FastAPI Swagger UI以JSON格式发送登录凭证的问题
问题原因
你遇到的422 Unprocessable Entity错误,是因为Swagger UI默认发送的请求格式(表单格式)与你的接口期望的application/json格式不匹配。你的接口通过Login这个Pydantic模型定义了JSON请求体,但Swagger UI未正确识别这一点,转而用form-data或x-www-form-urlencoded格式发送数据,导致接口无法解析凭证。
解决方法
只需显式指定请求体参数为JSON类型,让FastAPI明确告知Swagger UI使用JSON格式发送数据:
修改路由代码
在登录接口的参数中,用fastapi.Body显式包裹Login模型:
from fastapi import Body, Depends from sqlalchemy.orm import Session # 导入你的Login模型、db依赖和路由等 @router.post('/login') def login(request: Login = Body(...), db: Session = Depends(get_db)): user = db.query(models.User).filter(models.User.email == request.email).first() if not user: # 你的逻辑代码 # 后续逻辑
验证效果
重启FastAPI服务后,打开Swagger UI(默认地址http://127.0.0.1:5000/docs):
- 点击
/login接口的Try it out按钮,此时会显示JSON格式的输入框,而非单独的email、password表单字段 - 输入符合格式的JSON数据:
{ "email": "johny@gmail.com", "password": "abc" } - 发送请求即可正常获取
access_token
补充说明
curl请求正常是因为你明确指定了Content-Type: application/json并发送了JSON结构数据,而显式使用Body(...)可以强制Swagger UI遵循接口定义的请求格式,避免格式不匹配的问题。
内容的提问来源于stack exchange,提问作者MartinAg
相关产品推荐
相关产品推荐

