3.定义服务使用的逻辑消息
当服务的操作被调用时,服务被定义为消息交换。在wsdl文档中,这些消息被定义message元素。这些消息由称之为part元素的部分组成。
一个服务的操作,通过指定逻辑消息的方式来定义。当操作被调用时,逻辑消息被交换。(也就是说,逻辑消息代表了服务的操作)这些逻辑消息,将在网络上传输的数据定义为xml文档。他包含了所有的参数,这些参数是方法调用的一部分。(也就是说,逻辑消息里的参数,是操作对应方法的参数集合)
消息和参数列表:每一个被服务暴露的操作能且仅能有一个输入消息和一个输出消息。输入消息定义当操作被调用时,服务接受的所有消息。输出消息定义的是,当操作完成时服务返回的所有消息。fault消息定义的是服务返回错误时的数据。
另外,每个操作可以有一定数量的fault消息。这个fault消息定义了当服务发生错误时返回的数据。这些消息通常有一个部分,该部分提供足够的信息来让消费者知道错误是什么。
消息设计用于集成固有系统:如果你将已经存在的应用程序定义为一个服务,你必须确保方法(实现操作的方法)中使用到的每个参数都能够在消息中找到对应。你必须确保返回值也在操作的输出消息中。
定义你的消息的一个方法是:RPC风格。当使用RPC风格时,你使用给每个在参数列表中的参数定义一个part。每个消息part是基于在types中顶一个的type。
你的输入消息为每个输入参数对应一个part,同样输出消息为每个输出参数对应一个part。另外增加个part来对应返回值。如果一个参数既是输入,又是输出,那么它即作为输入又作为输出消息列出来。
RPC风格的消息定义是当服务使能存量系统时有用。它使用类似于TIBCO或者CORBA的模式传输。这些系统围绕着过程和方法来设计。正是由于这样,他们是最容易使用消息来建模。RPC风格也是服务和应用程序之间的映射清晰化。
为SOAP服务设计消息:当RPC风格用于建模存量系统,但是服务协会强烈地喜欢包装文档风格。在包装文档风格中,每个消息有一个part。这个消息的part参考了一个包装元素,该元素定义在types元素中。包装元素有如下特性:
- 他是一个包含一系列元素的复合类型
- 如果是一个输入消息的包装器,则:它的每个元素对应一个输入参数;他的名字,他的名字与相关的操作名相同。
- 如果是一个输出消息的包装器,则:它的每个元素对应输入参数,也对应输出参数。它的第一个元素代表了方法返回值。他的名字将通过增加Response到与之想关联的包装器的操作的名字上。
消息命名:每个消息都在其命名空间中有唯一名字,建议使用下面的命名规则:
- 消息应该被单一操作使用
- 输入消息名是在操作名后增加Request
- 输出消息名是在操作名后增加Response
- 错误消息名是在错误原因后加fault
消息部件:消息部件是逻辑消息最常用的单元。每个part被定义,用part元素。并且通过name属性,用type属性或element属性来指定数据类型。
消息允许重用part名。对于一个实例来说,如果一个方法有一个参数:foo,他被应用或者通过in/out传递,他能够作为一个Part存在于请求或者应答消息中。如下例:
<message name="fooRequest">
<part name="foo" type="xsd:int"/>
<message>
<message name="fooReply">
<part name="foo" type="xsd:int"/>
<message>
例子:假设你有一个服务器存储了个人信息并且提供一个方法,该方法换回雇员的数据,基于雇员ID.。该方法如下:
personalInfo lookup(long empId)
被映射到RPC风格的WSDL如下
<message name="personalLookupRequest">
<part name="empId" type="xsd:int"/>
<message/>
<message name="personalLookupResponse>
<part name="return" element="xsd1:personalInfo"/>
<message/>
映射到包装风格如下:
<types>
<schema ...>
...
<element name="personalLookup">
<complexType>
<sequence>
<element name="empID" type="xsd:int" />
</sequence>
</complexType>
</element>
<element name="personalLookupResponse">
<complexType>
<sequence>
<element name="return" type="personalInfo" />
</sequence>
</complexType>
</element>
</schema>
</types>
<message name="personalLookupRequest">
<part name="empId" element="xsd1:personalLookup"/>
<message/>
<message name="personalLookupResponse>
<part name="return" element="xsd1:personalLookupResponse"/>
<message/>
php学习之道:WSDL详解(二),古老的榕树,5-wow.com