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

Python中嵌入JSON参数化XML SOAP请求遇问题求助

解决SOAP信封内嵌JSON的参数化问题
  • 问题根源
    用str.format(**json_step)时,JSON结构里的{}会被误判为format的占位符,触发KeyError;而json.dumps处理后要么转义不符合XML规则,要么缩进不匹配SOAP服务要求,最终返回500错误。

  • 解决方案1:转义模板静态大括号+CDATA包裹JSON
    把SOAP模板里的静态大括号改成{{和}}(转义后format不会解析它们),同时用CDATA包裹生成的JSON,避免XML解析JSON里的特殊字符。示例代码:

    import json
    
    # SOAP模板:静态大括号用双大括号转义,预留JSON占位符
    soap_template = """
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:qry="QueryData_V1">
       <soapenv:Header/>
       <soapenv:Body>
          <qry:QueryRequest>
             <qry:QueryData>{json_content}</qry:QueryData>
          </qry:QueryRequest>
       </soapenv:Body>
    </soapenv:Envelope>
    """
    
    # 构造要嵌入的JSON数据
    query_json = {
        "user_id": "12345",
        "filters": {"status": "active", "type": "vip"}
    }
    
    # 生成符合要求的JSON字符串,控制缩进匹配服务要求
    json_str = json.dumps(query_json, indent=2)
    # 用CDATA包裹,避免XML解析JSON的特殊字符
    cdata_wrapped = f"<![CDATA[{json_str}]]>"
    
    # 填充模板生成最终信封
    final_soap = soap_template.format(json_content=cdata_wrapped)
    
  • 解决方案2:用字符串替换替代format
    如果模板结构复杂,直接用自定义占位符做字符串替换,彻底避免format的大括号冲突:

    import json
    
    soap_template = """
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:qry="QueryData_V1">
       <soapenv:Header/>
       <soapenv:Body>
          <qry:QueryRequest>
             <qry:QueryData>[[JSON_PAYLOAD]]</qry:QueryData>
          </qry:QueryRequest>
       </soapenv:Body>
    </soapenv:Envelope>
    """
    
    query_json = {"user_id": "12345", "filters": {"status": "active"}}
    json_str = json.dumps(query_json, indent=2)
    cdata_wrapped = f"<![CDATA[{json_str}]]>"
    
    # 替换占位符
    final_soap = soap_template.replace("[[JSON_PAYLOAD]]", cdata_wrapped)
    
  • 关键注意点

    • 核对SOAP服务要求的JSON缩进:有的服务要求无缩进(用indent=None),有的要求固定缩进,生成后对比静态可运行版本。
    • 必须保证JSON在XML中合法:要么用CDATA包裹,要么手动转义JSON里的<、>、&等XML特殊字符(CDATA是更简便的方式)。
    • 生成后打印信封内容,和静态可运行的版本逐行对比,确保格式完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 17:06:15