用SOAP进行远程过程调用(RPC)

_ 译者注:本人最近一直在学习 .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"

 1<soap-env:envelope --="" <!--="" envelope="" for="" namespace="">   
 2xmlns:SOAP-ENV = "http://schemas.xmlsoap.org/soap/envelope"&gt;   
 3<!-- namespace for xml schema specification ( for data type declarations) -->   
 4xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"&gt;   
 5<soap-env:header>
 6<myhead:userid soap-env:mustunderstand="1" xmlns:myhead="URI">   
 7user email id   
 8</myhead:userid>
 9</soap-env:header>
10<soap-env:body xmlns:bodyns="URI1">
11<bodyns:firstmethod>
12<parm1 xsi:type="int">1</parm1>
13<parm2 xsi:type="string">Ranjith</parm2>
14<parm3 xsi:type="string">Rajadurai</parm3>
15</bodyns:firstmethod>
16<soap-env:fault>
17<faultcode>server</faultcode>
18<faultstring>application error</faultstring>
19<faulterror>server name
20<detail xmlns:faultns="URI2">
21<faultns:message>Wrong number of parameters</faultns:message>
22<faultns:errorcode>1001</faultns:errorcode>
23</detail>
24</faulterror></soap-env:fault>
25<bodyns:firstmethodresponse>
26<return>My First RPC responded successfully</return>
27</bodyns:firstmethodresponse>
28</soap-env:body>
29</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有帮助。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus