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

POST请求提交数据返回400 Bad Request错误原因排查

DRF接口POST写入数据持续返回400错误排查

基础信息

已确认目标接口支持POST请求,但请求始终无法正常执行。

前端提交逻辑

const mitgliedAdd = {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify(mitarbeiter)
    };
fetch("/api/member", mitgliedAdd);

表结构参考

空数据结构示例如下:

{"number":"","firstName":"","lastName":"","begin":"","end":null,"email":"","durationStudentSelfGov":0}

本次待提交数据

{"number":"0148","firstName":"test","lastName":"test","begin":"2022-06-06","end":null,"email":"bla@bla.com","durationStudentSelfGov":5}

后端实现代码

基于Django REST Framework开发,接口和序列化器代码如下:

class MemberView(generics.ListCreateAPIView):
    queryset = Member.objects.all()
    serializer_class = MemberSerializer

class MemberSerializer(serializers.ModelSerializer):
    class Meta:
        model = Member
        fields = "__all__"

排查方向(按出现概率排序)

  • CSRF校验拦截:DRF默认使用Session认证时会强制开启CSRF校验,原生fetch请求不会自动携带csrftoken,直接发起POST会被中间件拦截返回400。可以从页面cookie中读取csrftoken值,在请求头中添加X-CSRFToken: 读取到的token值即可;测试环境也可以临时给视图加@csrf_exempt装饰器跳过校验,生产环境不建议这么做。
  • 字段约束冲突:核对Member模型的字段定义:
    • 检查number、email字段是否设置了unique=True,如果数据库中已经存在对应值的记录,序列化器校验不通过会直接返回400
    • 检查begin字段类型,如果模型定义为DateTimeField,传入的2022-06-06只有日期部分缺少时间信息,会触发格式校验失败
    • 检查模型中是否存在未在空结构里列出、且标记为null=False/blank=False无默认值的必填字段,这类字段缺失会直接返回400
  • 字段名不匹配:确认JS中序列化的mitarbeiter对象的所有key,和模型字段名完全一致,拼写、大小写错误(比如驼峰命名写错、漏写字符)都会被判定为非法字段或字段缺失。
  • 直接读取响应内容定位根因:DRF返回400状态码时,响应体里会明确返回具体错误字段和错误原因,直接打开浏览器开发者工具-网络面板,找到对应POST请求查看响应内容即可,比如返回{"number":["该值已存在"]}就能直接定位是唯一键冲突,不需要盲目排查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:39:09