17370845950

SOAP请求的XML Body怎么写 SOAP信封结构详解
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中定义的operationinput message决定,不能自由命名或省略必需元素。任意字段名拼写错误、层级错位或类型不符均触发“Unmarshalling Error”。

1、Body直接子元素名称必须与WSDL中 portType 的 operation 名称一致(如GetUserDetails)。

2、该子元素内部,每个参数名必须与WSDL中 message 的 part 元素引用的 element 名完全匹配(如userIdlocale)。

3、若参数为复杂类型,必须按XSD定义逐层展开所有必需子元素,不可遗漏 minOccurs="1" 的字段

三、带命名空间的Body示例(SOAP 1.1)

当目标服务要求显式命名空间绑定时,Body内操作元素需声明目标命名空间前缀,并确保该前缀在Envelope或其祖先节点中已定义。缺失命名空间声明将导致“Namespace not declared”错误。

1、在soap:Enve

lope中声明服务命名空间:xmlns:tns="http://example.com/user"

2、Body内调用元素使用该前缀:ails>

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中定义 —— 删除该声明或补全定义