上面消息的Header区包含一个transaction元素,它指定了方法调用必须从属于其中的事务编号。这里我说“必须”是因为transaction元素使用了mustUnderstand属性。如前所述,SOAP服务器要么遵照属性的指示处理请求,要么声明不能处理请求。假定SOAP服务器不能处理,它必须返回一个错误信息。这时的应答应该类似于:
Listing 9
<SOAP-ENV:Envelope xmlns:SOAP-ENV="
http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:MustUnderstand</faultcode>
<faultstring>SOAP Must Understand
Error</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
上面的代码类似Listing 7显示的错误信息。但应该注意的是,detail元素不再出现。正如我在前面指出的:SOAP规范规定,如果错误在处理Header区的时候出现,则错误消息中不应包含detail元素。事实上,我们可以根据detail元素是否出现,迅速判定错误是在处理Body区还是在处理Header区时出现。
三、SOAP与HTTP
在第一个例子中,我通过HTTP把定制的XML请求发送给服务器,但没有详细介绍这么做涉及到了哪些操作。现在我们回过头来看那个问题。怎样才能把一个SOAP请求(而不是定制的XML)通过HTTP发送给服务器?SOAP很自然地遵循了HTTP的请求/应答消息模型。这个模型在HTTP请求中提供SOAP请求参数,在HTTP应答中提供SOAP应答参数。实际上,SOAP 1.0特别指明HTTP作为它的传输协议。SOAP 1.1略有放松。虽然SOAP 1.1仍旧可以使用HTTP,但它也可以使用其他协议,比如SMTP。在这个系列的文章中,我只讨论通过HTTP使用SOAP的情形。
让我们返回Hello示例。如果我们通过HTTP把SOAP请求发送给服务器,则代码应该类似于:
Listing 10
POST http://www.SmartHello.com/HelloApplication HTTP/1.0
Content-Type: text/xml; charset="utf-8"
Content-Length: 587
SOAPAction: "http://www.SmartHello.com/HelloApplication#sayHelloTo"
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="
http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="
http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Header>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:sayHelloTo
xmlns:ns1="Hello"
SOAP-ENV:encodingStyle="
http://schemas.xmlsoap.org/soap/encoding/">
<name xsi_type="xsd:string">Tarak</name>
</ns1:sayHelloTo>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
API设计:如何正确开发应用程序接口
在交互组件化软件的世界里,没有比让组件之间以及组件与移动设备和浏览器之间进行连接的应用程序接口(API)更重要的东西了。
-
REST vs. SOAP:如何挑选最好的Web服务
在应用没有任何服务器端的组件情况下,有没有可能直接通过我的应用数据库直接使用这些Web服务?
-
BEST:SOAP/XML和REST的替代方案
虽然拥有大量的机架服务器,以及大量软件开发人员的组织,基于web和集成服务的SOAP和REST很适合他们,但也会出现问题。
-
REST和SOAP 谁使移动应用最受益?
你应该听说过REST,如果在移动应用开发中使用REST,而不是使用SOAP,最大好处是什么?