上篇文章(WSDL)已经说了:使用WSDL来理解一个web服务,当理解了之后,soap这个简单对象传输协议就开始负责整个通讯。
[b]SOAP 体系结构[/b]
有了对 SOAP 和它的用途的基本理解,我现在就展开对其体系结构的讨论以了解一些深层知识。请参阅 图 1, 在此图里面您可以识别典型 SOAP 通信体系结构中的一些组件:
SOAP 客户机
SOAP 服务器
实际服务
图 1. 一个典型 SOAP 通信体系结构的组件
[img]/upload/attachment/115616/aeeb9854-c4db-31e7-a10c-d0c7586efe52.jpg[/img]
下面开始针对这张图上的实体进行分析说明:
[b]1、SOAP 客户机[/b]
SOAP 客户机是一台有 SOAP 机制的机器,它可以产生 SOAP 请求并通过 HTTP 发送到服务器。一条 SOAP 请求是一种类型的 SOAP 消息,通常只有两种类型的 SOAP 消息:一条 SOAP 请求就是一台 SOAP 客户机发送给 SOAP 服务器的内容,一条 SOAP 响应就是 SOAP 服务器对 SOAP 客户机响应的内容。 清单 1是典型的 SOAP 请求,请参阅 清单 2来回顾 SOAP 响应。
清单 1:一条简单的 SOAP 请求
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
<SOAP-ENV:Body>
<m:getListOfModels xmlns:m = "uri reference" >
</m:getListOfModels>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
[b]2、SOAP 服务器[/b]
SOAP 服务器也是一台有 SOAP 机制的机器,能够接收来自 SOAP 客户机的请求,并对之作出适当的响应。这些编过码的响应会返回发出请求的 SOAP 客户机。在 SOAP 服务器内部有三个实体:
服务管理器
被部署服务的列表
XML 转换程序
服务管理器负责根据请求管理服务。请参阅 清单 1 的服务请求,在这里元素 <m:getListOfModels xmlns:m="urn:MobilePhoneservice" > 包含了服务的名称。[b]服务管理器会读取 SOAP 客户机想调用的 SOAP 服务的名称并检查所需的服务实际上是否驻留于这台 SOAP 服务器上。此后,它会查询被部署服务的列表(SOAP 服务器所托管的所有服务的列表)。若存在,服务管理器将把 SOAP 请求传送给 XML 转换程序。XML 转换程序就负责将 SOAP 请求的 XML 结构转换成程序员用来实现实际服务的编程语言(例如,Java 编程语言)的结构。还要负责将来自实际服务的响应转换回 SOAP 响应的 XML 结构。请参阅 清单 2获得 SOAP 响应的说明。 [/b]
清单 2:一条简单的 SOAP 响应
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<m:getListOfModelsResponse xmlns:m="urn:MobilePhoneservice">
<Model>M1</Model>
<Model>M2</Model>
<Model>M3</Model>
</m:getPriceResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
[b]实际服务[/b]
图 1中标有 actual service的框就是实际服务驻留的位置。服务实现可以是:例如,COM 组件或 JavaBeans 组件的形式。XML 转换程序负责将 XML 结构转换成合适的方法调用。当 XML 转换程序调用了实际服务实现的某个方法时,这个方法就会完成它的工作并且将结果信息返回 XML 转换程序。
请看一看 图 1中连接 XML translator 和 actual service 的箭头。箭头的两端同在一个企业内,这意味着同一个组织控制着通信两端的接口。与穿过企业边界的在 SOAP 客户机和 SOAP 服务器之间的箭头相比,这正是 SOAP 的目的所在。
[b]总结: [/b]
通过上面的理论,可以清楚的了解到当调用一个web服务时,soap协议的内部响应过程。另外,还有一点是非常重要的:
[b]当 SOAP 客户机向 SOAP 服务器发送 SOAP 消息时,用 HTTP 协议传输。这就叫做 SOAP 与 HTTP 绑定。
当服务端根据用户请求返回请求结果时,又一次用 HTTP 绑定来传输 SOAP 响应。[/b]