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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:42:20