You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter对接FastAPI时Uvicorn 422 Unprocessable Entity错误解决

FastAPI与Flutter注册接口422错误排查解决

问题情况

我正在对接FastAPI后端和Flutter前端的注册功能,后端的User模型和注册接口已编写完成,在Uvicorn自动生成的文档页面测试接口正常,但Flutter端用http.post和dio两种方式发送请求时,均返回422 Unprocessable Entity错误,无法确定是否为变量类型问题,需要排查解决。

后端代码

1. 用户模型

class User(BaseModel):
    user_name: str
    real_name: str
    password: str
    phone_number: str
    email: str
    car_number: int
    car_color: str
    car_type: str
    # car_license: str
    homeroom: str
    user_type: str
    warning: list[str]
    penalty: int 

2. 注册接口

@router.post("/create")
async def create_user(new_user: User):
    data = new_user.dict()
    hashed_pw = Hash.bcrypt(new_user.password)
    data["password"] = hashed_pw
    result = router.database.user.insert_one(data)
    return {"message": "User registration successful."}

前端代码

1. 两种请求方法

Future save(String inputusername, String inputName, String inputpassword,
      String inputphoneNumber, String inputemail, String inputhomeroom) async {
    final Map<String, dynamic> userData = {
      'userName': inputusername,
      'realName': inputName,
      'password': inputpassword,
      'phoneNumber': inputphoneNumber,
      'email': inputemail,
      'carNumber': 0, // 整数类型
      'carColor': '0',
      'carType': '0',
      'homeroom': inputhomeroom,
      'userType': 'Passenger',
      'warning': ['0'],
      'penalty': 0, // 整数类型
    };
    await http.post(Uri.parse('http://10.0.2.2:8000/user/create'),
        headers: <String, String>{
          'Content-Type': 'application/json; charset=UTF-8',
        },
        body: jsonEncode(userData));
  }


Future saveTwo(String inputusername, String inputName, String inputpassword,
      String inputphoneNumber, String inputemail, String inputhomeroom) async {
     await dio.post('http://10.0.2.2:8000/user/create', data: {
       'userName': inputusername,
       'realName': inputName,
       'password': inputpassword,
       'phoneNumber': inputphoneNumber,
       'email': inputemail,
       'carNumber': 0,
       'carColor': '0',
       'carType': '0',
       'homeroom': inputhomeroom,
       'userType': 'Passenger',
       'warning': ['0'],
       'penalty': 0
     });
  }

2. 按钮调用方式

TextButton(
        child: Text("Signin", style: TextStyle(color: Colors.white)),
                    onPressed: () {
                      save(
                          idController.text,
                          nameController.text,
                          pwController.text,
                          phoneController.text,
                          emailController.text,
                          homeroomController.text);
}
),

TextButton(
        child: Text("Signin", style: TextStyle(color: Colors.white)),
                    onPressed: () {
                      saveTwo(
                          idController.text,
                          nameController.text,
                          pwController.text,
                          phoneController.text,
                          emailController.text,
                          homeroomController.text);
}
),

错误原因

422错误的核心原因是字段命名不匹配:

  • FastAPI的User模型使用下划线命名法(如user_name、real_name)
  • Flutter请求中使用驼峰命名法(如userName、realName)
  • Pydantic模型默认严格匹配字段名,无法识别驼峰命名的字段,导致请求参数验证失败,返回422错误。

修复方案

方案一:修改Flutter请求字段名(推荐)

直接将Flutter中的字段名改为和后端一致的下划线命名:

修改后的save方法示例:

Future save(String inputusername, String inputName, String inputpassword,
      String inputphoneNumber, String inputemail, String inputhomeroom) async {
    final Map<String, dynamic> userData = {
      'user_name': inputusername,
      'real_name': inputName,
      'password': inputpassword,
      'phone_number': inputphoneNumber,
      'email': inputemail,
      'car_number': 0,
      'car_color': '0',
      'car_type': '0',
      'homeroom': inputhomeroom,
      'user_type': 'Passenger',
      'warning': ['0'],
      'penalty': 0,
    };
    await http.post(Uri.parse('http://10.0.2.2:8000/user/create'),
        headers: <String, String>{
          'Content-Type': 'application/json; charset=UTF-8',
        },
        body: jsonEncode(userData));
  }

saveTwo方法做同样修改即可。

方案二:修改FastAPI模型支持驼峰字段

如果不想修改前端代码,可以配置Pydantic模型自动映射驼峰字段到下划线字段:

from pydantic import BaseModel, ConfigDict
from pydantic.alias_generators import to_camel

class User(BaseModel):
    model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True)
    user_name: str
    real_name: str
    password: str
    phone_number: str
    email: str
    car_number: int
    car_color: str
    car_type: str
    homeroom: str
    user_type: str
    warning: list[str]
    penalty: int 
  • alias_generator=to_camel会自动将下划线字段生成驼峰别名(如user_name→userName)
  • populate_by_name=True允许同时接受原字段名和别名的请求参数

验证测试

修改完成后,重新运行前后端代码,点击注册按钮发送请求,即可正常完成注册,不再返回422错误。

内容的提问来源于stack exchange,提问作者Taetkyle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 21:44:59