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
相关产品推荐
相关产品推荐

