如何在Flask中解析带JSON体的x-www-form-urlencoded POST请求
Flask解析Content-Type为application/x-www-form-urlencoded的JSON请求体
问题本质
第三方请求的Content-Type被错误设置为application/x-www-form-urlencoded,但实际请求体是JSON字符串。Flask默认会按表单格式解析这类请求,导致常规JSON解析方法失效。
正确解析方法
方法1:直接解码原始请求体
通过获取原始请求体文本,先进行URL解码(因为x-www-form-urlencoded会自动编码特殊字符),再解析JSON:
from flask import Flask, request import json from urllib.parse import unquote app = Flask(__name__) @app.route('/your-endpoint', methods=['POST']) def handle_request(): # 获取原始请求体(转成字符串格式) raw_body = request.get_data(as_text=True) # 解码URL编码的内容,还原原始JSON字符串 decoded_json = unquote(raw_body) try: # 解析JSON parsed_data = json.loads(decoded_json) # 执行数据库插入操作 # db.session.add(YourModel(**parsed_data)) # db.session.commit() return {"status": "success"}, 200 except json.JSONDecodeError as e: return {"status": "error", "msg": f"JSON解析失败: {str(e)}"}, 400
方法2:检查是否存在表单参数包裹JSON
如果第三方实际是将JSON放在某个表单参数中(比如data={"key":"value"}),可直接提取参数值再解析:
@app.route('/your-endpoint', methods=['POST']) def handle_request(): # 获取表单参数中的JSON字符串 json_str = request.form.get('data') # 替换为实际参数名 if not json_str: return {"status": "error", "msg": "未找到有效JSON参数"}, 400 try: parsed_data = json.loads(json_str) # 数据库操作... return {"status": "success"}, 200 except json.JSONDecodeError as e: return {"status": "error", "msg": f"JSON解析失败: {str(e)}"}, 400
为什么之前的方法失效?
request.get_data()结合unquote:未指定as_text=True会返回字节对象,直接解码可能导致编码错误;另外若未先确认原始请求体内容,可能误处理了URL编码的部分。request.form:Flask会将application/x-www-form-urlencoded请求体按key=value解析,纯JSON内容会被拆分成无效的表单键值对,导致出现多余转义字符。request.get_json(force=True):强制解析JSON时,若请求体是URL编码后的JSON字符串,原始内容并非标准JSON格式,因此解析失败。
调试建议
先打印原始请求体内容,确认第三方发送的实际格式:
print("原始请求体内容:", request.get_data(as_text=True))
内容的提问来源于stack exchange,提问作者Anzu
相关产品推荐
相关产品推荐

