使用WSDL发布WebService(第二部分)简单对象访问协议——学习SOAP语法和使用SOAP发布WSDL
简 单对象访问协议(SOAP)提供了访问远程对象的方法。这样的对象有JavaBean,EJB组件,COM和COM+对象等等。这些对象使用不同的公司, 可能在互联网上随处可见。因此SOAP是一种在互联网上交换企业信息的机制。在本文中,笔者将讨论SOAP通信的细节,对象如何使用SOAP显示其功能, 如何调用SOAP对象以及如何在SOAP感知软件中交换信息。他将演示如何将第一部分中的WSDL程序发布为SOAP服务,及其远程调用。
一.SOAP 和 WSDL
我 在这个系列的第一部分介绍了WSDL。WSDL描述Web Service的接口。Web Service的拥有者将使用SOAP实现这些的接口。因此WSDL服务就以SOAP服务的形式存在。一旦Web Service的用户拥有了WSDL文件,他就知道了接口的详细资料,就可以使用SOAP同Web Service通信。 可以将你通过WSDL接口发布的Web Service看作对象,它可以通过SOAP从互联网上远程访问。既然服务都是对象,必然就会有一些属性跟每个服务及其行为相关。SOAP消息是可能工作在HTTP上的XML文件。 二.使用SOAP的原因
B2B(business- to-business)和A2A(application-to-application)需要通信的企业双方的指示以交换其信息。工作流的概念用于 B2B,并贯穿于企业集成。例如,某个企业调用供应商的服务以满足客户的需求,这就形成了一条垂直的供应链。有的供应商也会拓展供应联调用其他企业的服 务。
显然这类应用软件的交互性极其重要。任一企业都只是实现SOAP通信的一端,而另一端由互联网上的其他人实现。 在未来的几年里,企业集成和交互能力将成为软件工程师和企业极具挑战性的任务。平台依赖性也将是集成和交互能力达成的一大难题。SOAP是至今为止最简单的实现企业集成和交互能力的机制。 三.SOAP架构
在初步了解了SOAP及其作用后,下面我将讨论它的架构以了解其内部的情况。在图Figure 1中,你可以看见下面的组件运用于典型的SOAP通信机制中:
1. SOAP Client 2. SOAP Service 3. Actual Service
Figure 1. Components of a typical SOAP communication architecture 下面讨论上面提及的各个实体在架构中的角色。 SOAP Client
SOAP Client是一个SOAP感知机器,它可以产生SOAP请求并通过HTTP将SOAP请求发送给SOAP Server。SOAP Client是一种SOAP消息。一般来说有两种SOAP消息:SOAP Client发送给SOAP Service的SOAP请求消息和SOAP Service
发送给SOAP Client的SOAP响应消息。Listing 1是一个典型SOAP请求消息,而Listing 2则是一个典型SOAP响应消息。
SOAP Server
SOAP Server也是一个SOAP感知机器,它可以接受SOAP Client发来的请求并创建合适的响应。加密的响应会发给发出请求的SOAP Client。在SOAP Server内部有三个实体:
1. Service manager
2. Deployed service list 3. XML translator
Service manager管理响应请求的服务。在Listing 1中的SOAP请求中,节点
Actual Service
在Figure 1中标为Actual Service的方框显示了Actual Srrvice的位置。服务的实现可能是一个COM组件或是一个JavaBean组件。XML translator会把XML结构转换成合适的方法调用。当XML translator调用Actual Srrvice的方法时,这些方法会执行其功能并返回结果给XML translator。
Figure 1中连接XML translator和Actual Service的箭头的两端都在一个企业里,这意味着同一个组织控制着通信两端的接口。与此相反的是SOAP Client和SOAP Service穿越了企业的边界。这就是SOAP的用途。
SOAP请求响应机制
SOAP Client传输SOAP消息给SOAP Service时使用HTTP协议传输。
这称为SOAP绑定HTTP.当SOAP Service收到消息时,他将消息传给Service Maneger. SOAP Service检查Deployed service list中是否有SOAP消息请求的服务。如果没有该项服务,他将请求失败的响应发回给SOAP Client。但如果有该项服务,就由XML translator进行适合的语言转换,访问actual service的实现。服务的实现会处理请求并返回结果给XML translator. XML translator再将结果转换为SOAP Client理解的SOAP响应。同样,HTTP绑定也用在SOAP响应的传输上。
SOAP绑定HTTP
当 你将HTTP同SOAP帮定绑定或是在HTTP上操作SOAP时,你实际上在SOAP请求和响应上添加了HTTP头。Listing 1是典型的SOAP请求,而Listing 3,4,5,6演示了在Listing 1上添加了HTTP头的SOAP请求。与此类似的是Listing 7演示了在Listing 2上添加了HTTP头的SOAP响应。
当你在HTTP上使用SOAP时,Content-Type字段必须为text/html.在
Listing 7中可以看到Listing 3的细节。
一个使用HTTP的SOAP请求
你可以将SOAP联合在HTTP的请求方法POST上。要发送一个SOAP HTTP请求,你必须在HTTP头上提供一个SOAPAction字段。
SOAPAction定义了SOAP请求的目的。服务器(例如过滤HTTP上SOAP请求消息的防火墙)可以使用SOAPAction的值做决定。
HTTP客户端在发出SOAP请求时必须使用HTTP头的这个字段。SOAPAction可以取的值如下所示:
SOAPAction:”URI-Reference” SOAPAction:”filename” SOAPAction:”” SOAPAction
POST /Vendors HTTP/1.1
Host: www.mobilephoneservice.com Content-Type:\ Content-Length: nnnn
SOAPACtion:\
图Listing 3在SOAPAction中包含了下面的URI引用
www.mobilephoneservice.com/Vendors/MobilePhoneservice#getListOfModels
这个SOAPAction说明了两件事:一是SOAP发布的详细地址
www.mobilephoneservice.com/Vendors/MobilePhoneservice,二是我们感兴趣的方法的名称(#getListOfModels).
POST /Vendors HTTP/1.1
Host: www.mobilephoneservice.com Content-Type:\ Content-Length: nnnn
SOAPAction:\
图Listing 4在SOAPAction中包含了一个文件名
(MobilePhoneservice#getListOfModels)。MobilePhoneservice文件必须放在主机URI下(www. Mobilephoneservice.com/Vendors)。主机URI是由HTTP头的host字段加文件夹名(/Vendors)组成的。
POST /Vendors HTTP/1.1
Host: www.mobilephoneservice.com Content-Type:\ Content-Length: nnnn SOAPAction:\

