SOAP请求Body必须严格遵循信封规范:一、根元素为soap:Envelope并声明对应版本命名空间;二、Body内操作名与WSDL operation一致,参数名及结构须完全匹配XSD定义;三、命名空间需显式声明且正确绑定;四、SOAP 1.2禁用encodingStyle;五、避免未定义元素、类型错误和无效命名空间。

SOAP请求的XML Body必须严格遵循SOAP信封(Envelope)规范,否则服务端将拒绝解析或返回错误。以下是构建合法SOAP请求Body的详细说明:
一、SOAP信封基本结构
SOAP消息必须以soap:Envelope为根元素,并声明命名空间。命名空间决定了SOAP版本(1.1或1.2),直接影响头部处理逻辑与错误响应格式。未声明正确命名空间会导致“Invalid SOAP envelope”错误。
1、使用SOAP 1.1时,必须声明 xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"。
2、使用SOAP 1.2时,必须声明 xmlns:soap="http://www.w3.org/2003/05/soap-envelope"。
3、在soap:Envelope内,必须包含且仅包含一个 soap:Body 元素,可选包含 soap:Header。
二、SOAP Body内容构造规则
Body内嵌套的是具体操作的XML载荷,其结构由WSDL中定义的operation和input message决定,不能自由命名或省略必需元素。任意字段名拼写错误、层级错位或类型不符均触发“Unmarshalling Error”。
1、Body直接子元素名称必须与WSDL中 portType 的 operation 名称一致(如GetUserDetails)。
2、该子元素内部,每个参数名必须与WSDL中 message 的 part 元素引用的 element 名完全匹配(如userId、locale)。
3、若参数为复杂类型,必须按XSD定义逐层展开所有必需子元素,不可遗漏 minOccurs="1" 的字段。
三、带命名空间的Body示例(SOAP 1.1)
当目标服务要求显式命名空间绑定时,Body内操作元素需声明目标命名空间前缀,并确保该前缀在Envelope或其祖先节点中已定义。缺失命名空间声明将导致“Namespace not declared”错误。
1、在soap:Envelope中声明服务命名空间:xmlns:tns="http://example.com/user"。
2、Body内调用元素使用该前缀:
3、所有子元素继承该命名空间,无需为每个子元素重复声明 xmlns。
四、SOAP 1.2 Body特殊要求
SOAP 1.2对Body内容无隐式默认命名空间,且强制要求所有非SOAP命名空间的元素必须显式绑定。未绑定的自定义元素会被视为无命名空间,与WSDL期望不一致而被丢弃。
1、必须在 soap:Body 或其父节点声明服务命名空间,如 xmlns:ns="http://api.example.org"。
2、Body内操作元素必须使用该前缀:
3、SOAP 1.2禁止在Body内使用 soap:encodingStyle 属性,存在即报错。
五、常见无效Body结构及修正
实际请求中高频出现的结构错误会直接导致HTTP 500或SOAP Fault。这些错误无法通过服务端日志明确提示字段位置,需人工比对WSDL验证。
1、Body内出现未定义的顶层元素(如额外包裹
2、参数值为空字符串但XSD要求 xsd:int ——须移除该元素或设为有效整数。
3、使用了WSDL未声明的命名空间前缀(如 xmlns:xyz)且未在Envelope中定义 —— 删除该声明或补全定义。










