wsdl 学习

先上个图:
[img]http://dl.iteye.com/upload/attachment/471525/ee207bb6-faf0-39d3-ab56-3408b6bdcbeb.png[/img]
当然了学习之前是需要些基本知识的,比如xml,schema等
WSDL(web service description language)直译为网络服务描述语言,是使用xml编写的,用来描述网络上的服务,规定服务的位置以及服务具体提供的内容(操作等)
1、提供服务怎么来表示
那么想想如果是我自己提供一种服务的话,是不是就需要暴露接口呢,如何暴露呢,以及通过什么样的方式来暴露呢?这就引出了wsdl的一个元素,如上图最右侧所示的service元素,xml 片段如下:
<wsdl:service name="calservice">
<wsdl:port name="calserviceHttpPort" binding="tns:calserviceHttpBinding">
<wsdlsoap:address location="http://localhost:8080/test/services/calservice"/>
</wsdl:port>
</wsdl:service>

服务的名字就叫做calservice,服务已经提供了,那么服务具体提供的操作如何呢?又如何告知其他人来访问我的服务呢,接下来又引出了另外一个非常重要的元素portType和binding
2、提供了服务之后,用户最终调用的是服务里面的操作(或者叫做方法),那么如何描述服务内部的操作呢?这就是portType元素干的事情。portType可以比作一个操作的集合体,一个类,而每个操作就是里面一个个具体的函数。里面的operation子元素指定了具体的操作,以及输入参数,输出参数。输入输出都是一种消息的传递,消息元素在后面说明。
<wsdl:portType name="calservicePortType">
<wsdl:operation name="minus">
<wsdl:input name="minusRequest" message="tns:minusRequest">
</wsdl:input>
<wsdl:output name="minusResponse" message="tns:minusResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="multi">
<wsdl:input name="multiRequest" message="tns:multiRequest">
</wsdl:input>
<wsdl:output name="multiResponse" message="tns:multiResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="div">
<wsdl:input name="divRequest" message="tns:divRequest">
</wsdl:input>
<wsdl:output name="divResponse" message="tns:divResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="add">
<wsdl:input name="addRequest" message="tns:addRequest">
</wsdl:input>
<wsdl:output name="addResponse" message="tns:addResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>

我们定义了一个操作集合。里面提供的具体操作有加减乘除四个操作(add,minus,multi&div),还有输入参数跟输出参数
3、消息。上面看到的操作都有输入消息跟输出消息,我们可以把消息看作是对函数里面的参数进行的一种封装,输出消息也是对我们函数调用完之后返回值的一种封装。这样就可以理解消息的作用。输入参数可以看作是一种请求,而返回的输出消息可以看作一种响应。下面是代码片段。
消息内部的子元素part定义了我们输入输出参数的类型
<wsdl:message name="multiResponse">
<wsdl:part name="parameters" element="tns:multiResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="divResponse">
<wsdl:part name="parameters" element="tns:divResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="addRequest">
<wsdl:part name="parameters" element="tns:add">
</wsdl:part>
</wsdl:message>
<wsdl:message name="divRequest">
<wsdl:part name="parameters" element="tns:div">
</wsdl:part>
</wsdl:message>
<wsdl:message name="multiRequest">
<wsdl:part name="parameters" element="tns:multi">
</wsdl:part>
</wsdl:message>
<wsdl:message name="minusResponse">
<wsdl:part name="parameters" element="tns:minusResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="addResponse">
<wsdl:part name="parameters" element="tns:addResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="minusRequest">
<wsdl:part name="parameters" element="tns:minus">
</wsdl:part>
</wsdl:message>

上面的消息里面有子元素part,里面定义的是具体的参数。
4、那么消息内部的元素类型又是如何定义呢?这就是types元素的工作,它定义了我们web service 内部使用的数据类型,这些都是schema语法来定义的。
<wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service.jobar.com">
<xsd:element name="minus">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="in0" type="xsd:int"/>
<xsd:element maxOccurs="1" minOccurs="1" name="in1" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="minusResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="out" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="multi">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="in0" type="xsd:int"/>
<xsd:element maxOccurs="1" minOccurs="1" name="in1" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="multiResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="out" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="div">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="in0" type="xsd:int"/>
<xsd:element maxOccurs="1" minOccurs="1" name="in1" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="divResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="out" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="add">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="in0" type="xsd:int"/>
<xsd:element maxOccurs="1" minOccurs="1" name="in1" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="addResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="out" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>

数据类型的定义完全是schema定义的。不具体阐述了。
5、ok,我们的服务定义好了,操作也定义好了,输入输出参数也都定义好了,参数用到的内部数据类型等都定义好了,那么如何来讲这些操作跟服务关联起来呢?这就是binding大神做的事情了。
binding 元素有两个属性:name 属性定义 binding 的名称;而 type属性指向用于binding 的portType例子中是我们上面定义好的calservicePortType。
soap:binding 元素有两个属性:style 属性可取值为"rpc" 或 "document";transport 属性定义了要使用的 SOAP 协议,我们这里用的是http;当然出了soap协议外还可使用http/GET跟http/POST,相应的操作也是http。
http/GET:
<http:binding verb="GET"/>

http/POST:
<http:binding verb="POST"/>

operation 元素定义了每个portType提供的操作。
<wsdl:binding name="calserviceHttpBinding" type="tns:calservicePortType">
<wsdlsoap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="minus">
<wsdlsoap:operation/>
<wsdl:input name="minusRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="minusResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="multi">
<wsdlsoap:operation/>
<wsdl:input name="multiRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="multiResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="div">
<wsdlsoap:operation/>
<wsdl:input name="divRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="divResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="add">
<wsdlsoap:operation/>
<wsdl:input name="addRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="addResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>

以上就是学习wsdl的总结。这几个元素之间存在依存关系,可以看到一个依赖另外一个的定义。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值