Postman调用Flask Web API返回400 Bad Request错误排查
问题现象
基于Flask框架开发的JSON格式Web API,此前运行正常,通过Postman调用时返回400 Bad Request响应,响应内容如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <title>400 Bad Request</title> <h1>Bad Request</h1> <p>Did not attempt to load JSON data because the request Content-Type was not 'application/json'.</p>
服务端命令行同步输出日志:
"POST /json HTTP/1.1" 400 - code 400, message Bad request syntax ('{') "None /json HTTP/0.9" HTTPStatus.BAD_REQUEST -.
错误根因
- 请求头缺失或错误:Flask默认仅在请求携带
Content-Type: application/json头时,才会尝试解析请求体中的JSON数据,未匹配到该头时直接返回400错误,和响应页提示完全对应 - 请求格式非法:日志中
Bad request syntax ('{')、HTTP/0.9报错说明服务端收到的请求协议不符合HTTP/1.1规范,通常是JSON语法错误(括号不闭合、引号不匹配、多余尾逗号),或是JSON内容被错误填入Postman的form-data、x-www-form-urlencoded等非raw请求体区域,导致服务端无法正常解析请求头和请求体的分隔边界,误判定为无请求头的HTTP/0.9请求。
修复方案
- Postman侧配置修正
- 打开请求的Body标签,选中
raw选项,将右侧格式下拉框从默认的Text切换为JSON,该操作会自动为请求添加正确的Content-Type: application/json请求头 - 在raw编辑区填入语法合法的JSON结构,确认所有键名使用英文双引号包裹、对象和数组的括号完全闭合、键值对末尾无多余逗号
- 切换到Headers标签校验,确认
Content-Type值为application/json,无拼写错误或错误的编码参数
- 打开请求的Body标签,选中
- Flask侧兼容配置(可选,仅用于调试场景)
如果需要临时跳过Content-Type校验强制解析JSON,可以在调用get_json时传入force=True参数,示例代码:
注意:开启force参数会跳过请求格式校验,若收到非JSON格式的请求体可能触发解析异常,生产环境不建议开启from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/json', methods=['POST']) def handle_json(): req_data = request.get_json(force=True) # 执行业务逻辑 return jsonify({"code": 0, "msg": "success", "data": req_data})
内容的提问来源于stack exchange,提问作者Flo
相关产品推荐
相关产品推荐

