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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:55:17