Axios POST请求返回400错误,Postman同数据却正常(Django DRF+React.js)
解决DRF + Axios POST请求400错误的排查方案
我之前也碰到过一模一样的问题——Postman能正常请求,Axios却返回400,大概率是请求格式或头部设置出了问题,下面一步步帮你定位和解决:
第一步:先拿到DRF返回的详细错误信息
你现在的错误捕获只打印了error.toJSON(),但DRF在返回400错误时,会把具体的验证/解析错误放在error.response.data里。修改你的Axios错误处理代码:
.catch(error => { if (error.response) { // 这里会输出DRF返回的具体错误,比如哪个字段格式不对、必填项缺失 console.log("服务器返回的详细错误:", error.response.data); } else { console.log(error.toJSON()); } });
刷新页面再发一次请求,控制台就能看到具体的错误原因了,比如{"phone": ["Enter a valid phone number."]}或者{"non_field_errors": ["Invalid JSON payload."]}。
第二步:检查Axios的请求格式问题
看你的代码里用了JSON.stringify(data),这很可能就是问题根源:
- Axios默认会把JavaScript对象自动序列化为JSON字符串,同时自动设置
Content-Type: application/json请求头 - 如果你手动用
JSON.stringify()把data转成字符串,Axios会把它当成普通文本发送,默认的Content-Type会变成text/plain,DRF收到后无法解析为JSON,直接返回400
解决方法很简单,去掉JSON.stringify(),直接传data对象就行:
onSubmit = (data) => { console.log(data); axios.post('http://localhost:8000/api/customer-information/', data) .then(response => { console.log(response.data); }) .catch(error => { if (error.response) { console.log("服务器错误详情:", error.response.data); } else { console.log(error.toJSON()); } }); };
如果因为特殊需求必须传字符串,那手动指定Content-Type头部:
axios.post('http://localhost:8000/api/customer-information/', data, { headers: { 'Content-Type': 'application/json' } })
第三步:用Django日志深度排查
如果上面的方法还是没找到问题,就在Django的settings.py里配置日志,打印请求的完整细节:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.request': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': False, }, }, }
启动Django服务器后,控制台会输出每个请求的详细日志,包括DRF处理请求时的错误堆栈,能帮你精准定位问题。
内容的提问来源于stack exchange,提问作者jason
相关产品推荐
相关产品推荐

