fastapi HTTP 422 Unprocessable Entity
HTTP 422 Unprocessable Entity
错误通常表示服务器能够理解请求,但请求中的某些数据格式不正确,导致无法处理该请求。在 FastAPI 中,422 Unprocessable Entity
错误可能与请求体中的数据类型或格式不符合预期有关。
常见原因
- 请求体格式错误:发送的
POST
请求的数据格式可能与 FastAPI 期望的格式不同,例如,传递的数据未被正确地序列化为 JSON,或者字段不匹配。 - 缺少必填字段:FastAPI 的请求体模型可能定义了某些必填字段,但你在请求中没有传递这些字段。
- 字段类型不匹配:某些字段的数据类型与 FastAPI 定义的类型不一致。
如何排查
- 日志和错误信息:查看 FastAPI 提供的详细错误日志信息,通常它会明确指出哪个字段出现了问题。
- 校验数据类型:确保传递的数据类型与预期的数据类型相匹配。如果
message
期望是str
,但你传递了其他类型的数据(如int
),FastAPI 会返回 422 错误。
检查请求格式:确保发送的请求体数据格式正确,通常是 JSON 格式,例如:
{
"message": "你好"
}
如果你是用 curl
或其他工具发送请求,可以类似这样发送:
curl -X POST "http://localhost:8000/chat" -H "Content-Type: application/json" -d '{"message": "你好"}'
查看 FastAPI 中的请求体模型定义:检查你在 FastAPI 中定义的 /chat
端点是否有特定的 Pydantic
模型,看看哪些字段是必填字段,哪些字段是可选的。
from pydantic import BaseModel
class ChatRequest(BaseModel):
message: str # 假设你需要传递一个 `message` 字段
@app.post("/chat")
async def chat(request: ChatRequest):
return {"response": "Message received"}
例子
假设你的 /chat
端点期望一个 JSON 对象:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class ChatRequest(BaseModel):
message: str
@app.post("/chat")
async def chat(request: ChatRequest):
return {"response": f"Received: {request.message}"}
如果你发送以下不正确的请求:
curl -X POST "http://localhost:8000/chat" -H "Content-Type: application/json" -d '{"msg": "你好"}'
它会返回 422 Unprocessable Entity
,因为 msg
字段不符合 message
的字段名要求。
如何修正
- 确保在请求体中使用正确的字段名称和类型。
- 对于可选字段,定义时使用
Optional
类型。 - 查看 FastAPI 返回的详细错误消息,找出具体哪个字段存在问题。