接⼝测试之(⼆)WebService之WSDL⽂件讲解
WebService 之 WSDL⽂件 讲解
恩,我想说的是,是不是经常有⼈在开发的时候,特别是和第三⽅有接⼝的时候,⾛的是SOAP协议,然后⽤户给你⼀个WSDL⽂件,说按照上⾯的进⾏适配,嘿嘿,这个时候,要是你以前没有开发过,肯定会傻眼,那如果你想学习的话,就认真的看下⾯的讲解咯:
⼀、WSDL概述
WebServices Description Language (WSDL Web服务语⾔)是⼀个⽤于精确描述Web Service的⽂档格式。
WSDL⾮常适合于⽤作代码⽣成器,它能够读取WSDL⽂档,并且可以为访问Web服务⽣成⼀个的接⼝,⼤多数软件供应商和主要的标准机构(包括 、WS-I和OASIS)都⽀持WSDL。例如:JAX-RPC provider(例如:BEA Weblogic)通过API⽤WSDL⽣成相应的占位程序;IBM WebSphere、Microsoft.NET以及Apache Axis都有⾃⼰的⼯具⽣成相关的代码。下图是⼀个例⼦:
上⾯的例⼦JAX-RPC通过读取WSDL⽂档,创建JAX-RPC RMI接⼝(endpoint接⼝)和实现此接⼝的⽹络占位程序(stub)。客户端程序通过RMI接⼝,Stub和Web Service服务端交换SAOP消息。
⼆、WSDL基本结构
WSDL⽂档是⼀个遵循WSDL XML模式的XML⽂档(⽂档实例);类似于:SOAP⽂档是⼀个遵循SOAP XML模式的XML⽂档(⽂档实例);
⼀个WSDL⽂档的根元素是definitions元素,WSDL⽂档包含7个重要的元素:types, import, message, portType, operations, binding和service元素。
三、WSDL声明
3.1 XML声明
<?xml version="1.0" encoding="UTF-8"?>
WSDL的声明必须定义成使⽤:UTF-8 或者UTF-16 编码。
3.2 definition元素
所有WSDL⽂档的根元素都是definition元素。
上⾯的例⼦中:message元素利⽤name属性指定了标签(例如:GetBookPriceRequest),这些标签会⾃动使⽤targetNamespace的命名空间,标签了的messages元素通常被称为定义。
⽂档中的其他元素⽤标签和命名空间前缀去应⽤定义,例如上⾯的例⼦中:input元素是使⽤mh:GetBookPriceRequest来引⽤标签GetBookPriceRequest。
3.3 Types元素
Types元素⽤作⼀个容器,定义了⾃定义的特殊数据类型,在声明消息部分(有效负载)的时候,messages定义使⽤了types元素中定义的数据类型与元素。
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="BookQuoteWS"
targetNamespace="www.Monson-Haefel/jwsbook/BookQuote"
xmlns:mh="www.Monson-Haefel/jwsbook/BookQuote"
xmlns:soapbind="/wsdl/soap/"
xmlns:xsd="/2001/XMLSchema"
xmlns="/wsdl/">
<types>
<xsd:schema  targetNamespace="www.Monson-Haefel/jwsbook/BookQuote">
<!-- The ISBN simple type -->
<xsd:simpleType name="ISBN">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9]{9}[0-9Xx]"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
</types>
Types元素作为⼀个容器,⽤来定义XML模式内置的数据类型(即复杂类型和定制的简单类现,详细见Web Service XML⽂章)中没有描述的各种数据类型。例如:ISBN。
上⾯的例⼦中,types元素中直接嵌套了⼀个完整的W3C XML模式⽂档,此⽂档中targetNamespace必须是⼀个有效的⾮空值,⽽且必须属于由WSDL⽂档。
3.4 Import元素
Import元素可以让当前的⽂档使⽤其他WSDL⽂档中指定命名空间中的定义。
<definitions name="AllMhWebServices"
xmlns="/wsdl/">
<import namespace="www.Monson-Haefel/jwsbook/BookQuote"
location="www.Monson-Haefel/jwsbook/BookPrice.wsdl"/>
<import namespace="www.Monson-Haefel/jwsbook/po"
location="www.Monson-Haefel/jwsbook/wsdl/PurchaseOrder.wsdl"/>
<import namespace="www.Monson-Haefel/jwsbook/Shipping"
location="www.Monson-Haefel/jwsbook/wsdl/Shipping.wsdl"/>
</definitions >
WSDL的import元素必须声明两个属性,即namespace属性和location属性。
namespace属性必须和正导⼊的WSDL⽂档中声明的targetNamespace相匹配。
location属性必须指向⼀个实际的WSDL⽂档。
四、WSDL抽象接⼝
Message、portType和operation元素⽤于描述Web服务的抽象接⼝,相当于JAVA或者C++中编程中的类的接⼝。其中portType 相当于类接⼝的名称;operation相当于接⼝中包含的函数,message相当于函数的参数和返回值。
4.1 Message元素
Message元素描述了Web服务的有效负载。相当于函数调⽤中的参数和返回值。
<message name="GetBulkBookPriceRequest">
<part name="isbn" type="xsd:string"/>
<part name="quantity" type="xsd:int"/>
</message>
<message name="GetBulkBookPriceResponse">
<part name="price" type="mh:prices"/>
</message>
RPC式样的Web服务的message服务
GetBulkBookPriceRequest表⽰消息的输⼊(相当于函数的参数),GetBulkBookPriceResponse表⽰消息的输出(相当于函数的返回值)
Web Service的输⼊和输出参数可以是多个(⼀个特点),每⼀个输⼊或者输出使⽤part元素定义,RPC样式必须使⽤type来定义类型
RPC样式⽤类型来数据定义过程调⽤,调⽤中的每⼀个元素表⽰某⼀个类型的参数。
<types>
<xsd:schema targetNamespace="www.Monson-Haefel/jwsbook/PO">
<!-- Import the PurchaseOrder XML schema document -->
<xsd:import namespace="www.Monson-Haefel/jwsbook/PO"
schemaLocation="www.Monson-Haefel/jwsbook/po.xsd"/>
</xsd:schema>
</types>
<!-- message elements describe the input and output parameters -->
<message name="SubmitPurchaseOrderMessage">
<part name="order" element="mh:purchaseOrder"/>
</message>
⽂档式样Web服务的Messages元素:
当⽤户采⽤⽂档式样消息传递模式的时候,messages元素要应⽤types定义中的顶级元素。具体顶级元素的定义和XML schema详见Web Server XML⽂档。
消息部分使⽤element属性定义
⽂档式样的消息传递要交换XML⽂档,并且应⽤它们的顶级元素。
注:Messages元素的RPC/Document试样对应了SOAP RPC/Document消息传递模式,详细见Web Server SOAP相关⽂档
注:Messages元素的RPC/Document试样对应了SOAP RPC/Document消息传递模式,详细见Web Server SOAP相关⽂档
<types>
<xsd:schema targetNamespace="www.Monson-Haefel/jwsbook/PO">
<!-- Import the PurchaseOrder XML schema document -->
<xsd:element name="InvalidIsbnFaultDetail">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="offending-value" type="xsd:string"/>
<xsd:element name="conformance-rules" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</types>
<!-- message elements describe the input and output parameters -->
<message name="GetBookPriceRequest">
<part name="isbn" type="xsd:string"/>
</message>
<message name="GetBookPriceResponse">
<part name="price" type="xsd:float"/>
</message>
<message name="InvalidArgumentFault">
<part name="error_message" element="mh:InvalidIsbnFaultDetail"/>
</message>
声明错误消息:
错误使⽤的消息定义只能采⽤Document/Literal编码样式
上⾯声明了匿名类型,InvalidIsbnFaultDetail不需要type类型,complexType中也不包括name属性,详细见Web Service XML相关⽂档。
4.2 portType元素
PortType元素定义了Web服务的抽象接⼝,它可以由⼀个或者多个operation元素,每个operation元素定义了⼀个RPC样式或者⽂档样式的Web服务⽅法。
4.3 operation元素
Operation元素要⽤⼀个或者多个messages消息来定义它的输⼊、输出以及错误。
<message name="GetBulkBookPriceRequest">
<part name="isbn" type="xsd:string"/>
<part name="quantity" type="xsd:int"/>
</message>
<message name="GetBulkBookPriceResponse">
<part name="prices" type="mh:prices"/>
</message>
<message name="InvalidArgumentFault">
<part name="error_message" element="mh:InvalidIsbnFaultDetail"/>
</message>
<portType name="GetBulkBookPrice">
<operation name="getBulkBookPrice" parameterOrder="isbn quantity">
<input name="request" message="mh:GetBulkBookPriceRequest"/>
<output name="prices" message="mh:GetBulkBookPriceResponse"/>
<fault name="InvalidArgumentFault" message="mh:InvalidArgumentFault"/>
如何生成webservice客户端</operation>
</portType>
Input表⽰传递到Web服务的有效负载;output表⽰返回给客户的有效负载;可以不包括,也可以包括⼀个或者多个fault错误消息。
parameterOrder定义了input和output消息采⽤的正确的顺序
使⽤parameterOrder的时候,必须包含所有输⼊参数部分;并且只包含不是返回类型的输出部分,如果output只有⼀个part(上例),会假设返回值,所以不包括在parameterOrder中
如果parameterOrder列出output中的part部分,那么这个将被作为OUT参数,如果input元素和output元素使⽤相同的名称声明了⼀个部分的时候,此部分为INOUT参数
4.4 WSDL消息交换模式()
Messaging Exchange Patterns(MEP)
Web服务中使⽤了四种消息交换模式,即请求/响应、单向、通知以及恳求/响应模式。⼤多数基于WSDL的web服务使⽤请求/响应和单向两种模式。
WSDL通过operation元素的input/output来定义使⽤那种模式,如果有input+output+可选的fault参数,那就使⽤请求/响应模式;如果只使⽤input,那就使⽤单向模式。
在通知模式中:Web服务将消息发送给客户,但不等待回复;⼀般客户通过注册来接收通知;在恳求/响应模式中类似通知模式,唯⼀的区别要期待客户对Web服务的响应。
五、WSDL实现:binding元素
Binding元素将⼀个抽象的portType映射到⼀组具体的协议(SOAP或者HTTP)、消息传递样式(RPC或者document)以及编码样式(literal或者SOAP encoding)。
Binding的类似于将接⼝或者函数的调⽤绑定到某种协议上:例如CORBA、COM或者RPC的⽅式,这⾥使⽤SOAP协议。
5.1 soapbind:binding元素

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。