六、SOAP的消息传递模式
SOAP共支持四种消息传递模式:RPC/Literal 、Document/Literal 、RPC/Encoded 和Document/Encoded模式。常用的是前两种模式,而且WEB SERVICE也只支持前两种。
1、Document/Literal 消息传递模式
例如: <soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<p582:op2 xmlns:p582="http://apiNamespace.com">
<in>
<data1>3</data1>
<data2>4</data2>
</in>
</q0:op2>
</soapenv:Body>
</soapenv:Envelope>
<soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<p582:op2Response xmlns:p582="http://apiNamespace.com">
<op2Return>
<data1>300</data1>
<data2>400</data2>
</op2Return>
</p582:op2Response>
</soapenv:Body>
</soapenv:Envelope>
SOAP的Body元素包含一个XML文档段,该文档段是一个格式良好的XML元素,它包含独立于SOAP消息的属于XML模式和名称空间的任意应用程序(文本和其他元素)。
2、RPC/Literal 消息传递模式
例如:<soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<op3>
<p10:DataElem xmlns:p10=
"http://dataNamespace.com">
<data1>5</data1>
<data2>6</data2>
</p10:DataElem>
<in2>
<p971:RefDataElem xmlns:p971=
"http://refNamespace.com">7</p971:RefDataElem>
</in2>
</op3>
</soapenv:Body>
</soapenv:Envelope>
RPC/Literal 消息传递模式与Document/Literal消息传递模式不同,后者并不会假设在消息的Body元素内包含元素的类型与结构(但文档要遵循一些XML模式)。前者要携带一些简单的参数。RPC样式的消息传递是分布式技术中常用的方式,其中包括EJB、CORBA、DCOM等。所以SOAP为RPC样式的消息传递定义了一个标准的XML格式,即RPC/Literal传递。
另外两种消息传递模式不常用,且WS BP1.0也不支持,所以就不写了。
七、SOAP错误
错误元素包括:faultcode元素、 faultString元素、 faultactor元素、 detail元素。
例如:<?xml version="1.0"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>XML for Analysis 提供程序遇到错误</faultstring>
<faultactor>XML for Analysis Provider</faultactor>
<detail>
<faultstring>
<Error
ErrorCode="2147483653"
Description="出现意外的错误。"
Source="XML for Analysis Provider"
HelpFile=""
/>
</faultstring>
</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Envelope>
1、SOAP faultcode元素
顾名思义就是SOAP错误代码,一看就知道是用来表示错误类型的。
错误类型 | 表示 | 错误来源 | |
Client错误 | soap:Client | 传递SOAP消息的节点出现错误 | |
Server错误 | soap:Server | 收到SOAP消息的节点发生故障或不能处理SOAP消息。 | |
VersionMismatch错误 | soap:VersionMismatch | 接收节点不能识别SOAP消息的Envelope元素的命名空间 | |
MustUnderstand错误 | soap:MustUnderstand | 消息文件头指向当前节点,并将MustUnderstand属性设置为“1”,但是当前节点不能识别该文件头 |
2、faultString元素
faultString元素是强制元素,也就是说,每个SOAP fault元素必须包含一个faultString子元素。可以通过元素属性 xml:lang=" "来指明faultString的语言类型。例如:xml:lang="es"表示描述字符串是意大利语。
3、faultactor元素
faultactor元素表示遇到了错误并产生了错误的节点。如果错误是一个中介体(即中间节点),那么需要使用faultactor元素,但如果错误节点是最终接收方,则该元素可有可无。
4、detail元素
如果Body元素的内容产生了一个错误,则必须包含错误消息的detail元素,但如果当处理文件头时发生了错误,则不能包含该元素。使用空detail元素是合法的。