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是更简便的方式)。 - 生成后打印信封内容,和静态可运行的版本逐行对比,确保格式完全一致。
- 核对SOAP服务要求的JSON缩进:有的服务要求无缩进(用
内容的提问来源于stack exchange,提问作者Cynthia Coleman
相关产品推荐
相关产品推荐

