fastapi HTTP 422 Unprocessable Entity

HTTP 422 Unprocessable Entity 错误通常表示服务器能够理解请求,但请求中的某些数据格式不正确,导致无法处理该请求。在 FastAPI 中,422 Unprocessable Entity 错误可能与请求体中的数据类型或格式不符合预期有关。

常见原因

  1. 请求体格式错误:发送的 POST 请求的数据格式可能与 FastAPI 期望的格式不同,例如,传递的数据未被正确地序列化为 JSON,或者字段不匹配。
  2. 缺少必填字段:FastAPI 的请求体模型可能定义了某些必填字段,但你在请求中没有传递这些字段。
  3. 字段类型不匹配:某些字段的数据类型与 FastAPI 定义的类型不一致。

如何排查

  1. 日志和错误信息:查看 FastAPI 提供的详细错误日志信息,通常它会明确指出哪个字段出现了问题。
  2. 校验数据类型:确保传递的数据类型与预期的数据类型相匹配。如果 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 返回的详细错误消息,找出具体哪个字段存在问题。