译者注:本人最近一直在学习.NET,对XML及微软倡导的SOAP协议更是情有独衷。因此为了促进自己的学习,也为了和志同道合者进行交流,翻译这篇文章。这是我第一次翻译文章,措词和对专业术语的把握不一定恰当,也不知道能不能发表,如果能有幸献丑,望讨论和指教。
下面是一个关于用简单对象访问协议SOAP(simple object access protocol)进行远程过程RPC(remote procedure call)的例子。发送往Web 服务器(the Web service)请求远程服务的SOAP消息是基于HTTP协议的,并且是采用XML文档格式。Web服务器处理接受到的根据SOAP协议封装的请求(request),然后同样回送给客户端以SOAP协议封装的应答(response)。
POST/ FirstSoap.aspx HTTP/1.1
Host: www.anyserver.com
Content-Type: text/xml; charset="utf-8"
Content-Length:888
SOAPAction: "uri:uniqueuriofthewebservice"
<SOAP-ENV:Envelope
<!-- namespace for envelope -->
xmlns:SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope">
<!-- namespace for xml schema specification ( for data type declarations) -->
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Header>
<MYHEAD:USERID
xmlns:MYHEAD="URI"
SOAP-ENV:mustUnderstand="1">
user email id
</MYHEAD:USERID>
</SOAP-ENV:HEADER>
<SOAP-ENV:Body xmlns:BODYNS="URI1">
<BODYNS:FirstMethod>
<parm1 xsi:type="int">1</parm1>
<parm2 xsi:type="string">Ranjith</parm2>
<parm3 xsi:type="string">Rajadurai</parm3>
</BODYNS:FirstMethod>
<SOAP-ENV:Fault>
<faultcode>server</faultcode>
<faultstring>application error</faultstring>
<faulterror>server name</faultactor>
<detail xmlns:Faultns="URI2">
<Faultns:Message>Wrong number of parameters</Faultns:Message>
<Faultns:ErrorCode>1001</Faultns:ErrorCode>
</detail>
</SOAP-ENV:Fault>
<BODYNS:FirstMethodResponse>
<return>My First RPC responded successfully</return>
</BODYNS:FirstMethodResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
上面这个SOAP消息包括以下几个基本元素:
1 报套(Envelope)
2 报头(Header)
3 报体(Body)
所有的SOAP消息都封装在报套(Envelope)这样一个元素之内。为确定范围,每个元素应有命名空间。元素的成员在命名空间内可以被访问。之所以需要命名空间,是为了避免在不同的地方(译者注:此处“不同的地方”,我的理解是不同的Web服务器)有相同的元素名而引起的混乱。
在上面这个SOAP消息中,为了进行权限认证,报头元素传送了用户的Email地址。报头中的“mustUnderstand”属性使得Web服务器要进行权限认证。即处理这个SOAP消息的Web服务器必须要理解报头中的这样一个属性参数。这个属性参数等于1表明,Web服务器在进行处理之前进行权限确认是强制性的,否则,Web服务器将不处理这样一个消息。
报体元素(Body element)包括一个方法,此方法在Web服务器上。这个方法在Web服务器上可以用任何语言进行定义,并包括3个参数,这3中数据类型在命名空间xsi内被定义(译者注:在报头前有这样一句xsi = "http://www.w3.org/2001/XMLSchema-instance,看不太懂的朋友要多看看XML方面的书籍)。如果这样一个SOAP消息封装正确,那么它激活Web服务器上的方法FirstMethod并返回一个值。
如果Web服务器在处理这样一个消息过程中发生错误,将返回一个在报体内有Fault元素的SOAP消息。仅仅在处理时发生错误才传送这样一个消息。当传送数据或参数到Web服务器发生错误时将显示正常的HTTP错误。任何错误的SOAP消息都含有以下四个子元素:
1.faultcode(optional) – 包含发生错误的类型
2.faultstring(optional) – 包含发生错误的起因
3.faultactor – 包含发生错误的服务器名称
4.details – 包含2个子元素.
a. message – 包含详细的错误内容
b. errorcode – 错误代码
当Web服务器执行FirstMethod方法成功之后,它返回一个SOAP消息给客户端,此消息当然也是以XML格式封装。FirstMethodResponse元素包含返回的值。任何应答元素名称都是由调用的方法名加上后缀Response组成。
这SOAP消息以HTTP协议包发送到www.anyserver.com/FirstSoap.aspx,Web服务器上的FirstMethod方法被激活。SoapAction描述了能被唯一激活的Web服务的URI。
译者注:朋友们最好到http://www.w3.org/TR/SOAP/#_Toc478383526详细的看一下Simple Object Access Protocol (SOAP) 1.1,我想会对你学习SOAP有帮助。