Flutter向Django本地API发送数据遇400错误,Postman可正常请求
排查Flutter POST请求400错误(Django本地API)
1. 核对请求头Content-Type
Postman会自动适配Content-Type: application/json,但Flutter请求如果没明确设置,可能导致格式不匹配。确保请求头包含正确类型:
headers: { 'Content-Type': 'application/json', }
如果是表单格式(application/x-www-form-urlencoded),Django视图要对应使用request.POST而非DRF的request.data。
2. 校验请求体格式
- 必须用
json.encode()将Map转为JSON字符串,不能直接传Map:
final response = await http.post( Uri.parse('http://你的本地API地址'), headers: {'Content-Type': 'application/json'}, body: json.encode({ '字段名1': '值1', '字段名2': '值2', }), );
- 对比Postman的请求体,确保Flutter发送的键名、数据类型完全匹配(比如Django模型字段是
username,不能写成UserName)。
3. 处理Django的CSRF校验
如果视图加了csrf_protect装饰器,Flutter没传CSRF token会触发400:
- 开发环境可临时注释settings.py里的
'django.middleware.csrf.CsrfViewMiddleware'(生产环境禁用此操作); - 或者先通过GET请求获取CSRF token,再在POST请求头里带上
'X-CSRFToken': '获取到的token值'。
4. 查看DRF序列化器错误
如果用了Django REST Framework,400大概率是序列化器校验失败。在视图里打印错误信息:
from rest_framework.response import Response from rest_framework import status def your_api_view(request): serializer = YourModelSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) # 打印错误到控制台 print(serializer.errors) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
通过控制台输出的错误,就能定位是哪个字段缺失或格式不符。
5. 确认本地网络配置
- 确保Flutter设备(模拟器/真机)和Django服务在同一局域网;
- Django的settings.py里
ALLOWED_HOSTS设置为['*']或你的设备IP,避免主机校验失败返回400。
内容的提问来源于stack exchange,提问作者michxiz30
相关产品推荐
相关产品推荐

