之前我们用WebService搭建了服务端,使用客户端获取服务端提供的WebService方法,然后还学习了普通数据类型以及List和JavaBean数据类型在WebService上的传输和使用。
我们经常见到WebService中有“WSDL”字样,我们访问的WebService接口也是充满了XML配置,那么WSDL和XML有什么关系?我们的服务是怎么样让对方获取的呢?
想要知道以上这些,我们要了解WSDL、SOAP和UDDI。
其实WSDL就是Web Service Definition Lanauage,即WebService定义语言
。也就是我们之前在浏览器上访问出的xml,就是WSDL构造出的对外暴露的WebService定义语言,在客户端会通过wsdl2Java指令来翻译服务端提供的这段XML,从而在客户端获取WebService提供的方法。
我们看一下我们之前发布的webService:
即是
简单说就是以下内容:
我们详细解析一下这段XML。
首先第一段标签名为definitions,targetNamespace相当于Java中的package(xmlns相当于Java的import)。其内容http://impl.ws.cxf.java.org/和我们服务端的实现类的包名一样。
import标签中的namespace即是我们的接口所在的包,location是WebService对外暴露的接口的WSDL文档路径(http://127.0.0.1:8082/sayHi?wsdl=1)。
所以上面<import/>是接口的定义,下面的<binding>和<service>标签是Service的实现。
所以一个WSDL文档大致分为以下模块:
1.接口部分文档
我们首先来分析接口部分文档,我们来访问一下刚刚上面import标签中location的路径http://127.0.0.1:8082/sayHi?wsdl=1:
收起里面复杂的数据,其实大致为以下结构
其中type中存放的是一个标准的schema格式的数据
xsd:import中引入了一个namespace,location中引入了该接口所有数据类型,我们来访问一下http://127.0.0.1:8082/sayHi?xsd=1,得到:
我们可以看到里面包含了所有方法的输入参数类型和返回参数类型,其中的minOccurs是该参数出现的最小次数,maxOccurs是参数出现的最大次数。
像<xs:element name="return" type="tns:cat" minOccurs="0" maxOccurs="unbounded"/>这个标签的意思就是,像List中的Cat这种返回值类型可能出现的个数是0-N个。
可以看到wsdl文档的最后有一个portType的标签对,里面存放了所有可以调用的WebServcie服务,然后里面是服务的输入输出,其中的message属性就对应上面的message属性。
其中message属性的详细定义,就在types的xsd:schema中定义,而其中的xsd:import标签就引入了各种格式的定义文档路径。
所以,一次WebService的调用,其实并不是方法调用,而是发送SOAP消息(即XML文档片段)。
对于sayHi操作来说,传入的消息是
对于getCatsByUser操作来说,传入的消息是
2.实现类部分文档
我们回到之前的路径http://127.0.0.1:8082/sayHi?wsdl:
上面我们访问的http://127.0.0.1:8082/sayHi?wsdl=1是接口类的定义文档,所以上面<import/>是接口的定义,下面的<binding>和<service>标签是Service的实现。
binding中绑定了可操作的方法,以及输入输出参数。
service中定义了该WebService对外提供的服务接口地址。
所以整个WSDL的文档结构就是:
通俗的说,WSDL文档描述了WebService如下3个方面:
--what:该WebService包含“什么”操作。
--how:该WebService的操作应该“怎么”调用。
--where:该WebService的服务地址。
调用一次WebService的本质:
1.客户端把调用方法参数,转换成XML文档片段(SOAP消息,input消息),该文档片段必须符合WSDL定义的格式。
2.通过网络,把XML文档片段从客户端传送给服务器。
3.服务器接收到XML文档片段。
4.服务器解析XML片段,提取其中的数据,并把数据转换成调用WebService所需要的参数值。
5.服务器执行方法。
6.把执行的方法得到的返回值,再次转换生成为XML文档片段(SOAP,output消息),该文档片段必须符合WSDL定义的格式。
7.通过网络,把XML文档片段传送给客户端。
8.客户端接收到XML文档片段。
9.客户端解析XML片段,提取其中的数据,并把数据转换成调用WebService所需要的返回值。
从上面调用本质来看,要一个语言支持WebService,唯一的要求就是:该语言支持XML文档解析、生成、支持网络传输。
只要得到WebService文档,程序就可以调用WebService。
转载请注明出处:http://blog.csdn.net/acmman/article/details/52179346
我们经常见到WebService中有“WSDL”字样,我们访问的WebService接口也是充满了XML配置,那么WSDL和XML有什么关系?我们的服务是怎么样让对方获取的呢?
想要知道以上这些,我们要了解WSDL、SOAP和UDDI。
其实WSDL就是Web Service Definition Lanauage,即WebService定义语言
。也就是我们之前在浏览器上访问出的xml,就是WSDL构造出的对外暴露的WebService定义语言,在客户端会通过wsdl2Java指令来翻译服务端提供的这段XML,从而在客户端获取WebService提供的方法。
我们看一下我们之前发布的webService:
即是
<definitions targetNamespace="http://impl.ws.cxf.java.org/" name="HelloworldWs">
<import namespace="http://ws.cxf.java.org/" location="http://127.0.0.1:8082/sayHi?wsdl=1"/>
<binding name="HelloworldWsPortBinding" type="ns1:HelloWorld"><soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="sayHi">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<operation name="getCatsByUser">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="HelloworldWs">
<port name="HelloworldWsPort" binding="tns:HelloworldWsPortBinding">
<soap:address location="http://127.0.0.1:8082/sayHi"/>
</port>
</service>
</definitions>
简单说就是以下内容:
<definitions>
<import/>
<binding>
......
</binding>
<service name="HelloworldWs">
......
</service>
</definitions>
我们详细解析一下这段XML。
首先第一段标签名为definitions,targetNamespace相当于Java中的package(xmlns相当于Java的import)。其内容http://impl.ws.cxf.java.org/和我们服务端的实现类的包名一样。
import标签中的namespace即是我们的接口所在的包,location是WebService对外暴露的接口的WSDL文档路径(http://127.0.0.1:8082/sayHi?wsdl=1)。
所以上面<import/>是接口的定义,下面的<binding>和<service>标签是Service的实现。
所以一个WSDL文档大致分为以下模块:
1.接口部分文档
我们首先来分析接口部分文档,我们来访问一下刚刚上面import标签中location的路径http://127.0.0.1:8082/sayHi?wsdl=1:
收起里面复杂的数据,其实大致为以下结构
其中type中存放的是一个标准的schema格式的数据
<types>
<xsd:schema>
<xsd:import namespace="http://ws.cxf.java.org/" schemaLocation="http://127.0.0.1:8082/sayHi?xsd=1"/>
</xsd:schema>
</types>
xsd:import中引入了一个namespace,location中引入了该接口所有数据类型,我们来访问一下http://127.0.0.1:8082/sayHi?xsd=1,得到:
我们可以看到里面包含了所有方法的输入参数类型和返回参数类型,其中的minOccurs是该参数出现的最小次数,maxOccurs是参数出现的最大次数。
像<xs:element name="return" type="tns:cat" minOccurs="0" maxOccurs="unbounded"/>这个标签的意思就是,像List中的Cat这种返回值类型可能出现的个数是0-N个。
可以看到wsdl文档的最后有一个portType的标签对,里面存放了所有可以调用的WebServcie服务,然后里面是服务的输入输出,其中的message属性就对应上面的message属性。
其中message属性的详细定义,就在types的xsd:schema中定义,而其中的xsd:import标签就引入了各种格式的定义文档路径。
所以,一次WebService的调用,其实并不是方法调用,而是发送SOAP消息(即XML文档片段)。
对于sayHi操作来说,传入的消息是
<sayHi>
<arg0>字符串</arg0>
</sayHi>
传出的消息是:
<sayHiResponse>
<return>字符串</return>
</sayHiResponse>
对于getCatsByUser操作来说,传入的消息是
<getCatsByUser>
<arg0>
<id>整数值</id>
<name>字符串</name>
<pass>字符串</pass>
<address>字符串</address>
</arg0>
</getCatsByUser>
传出的消息是:
<getCatsByUserResponse>
<return> --可能出现0-N次
<id>整数值</id>
<name>字符串</name>
<color>字符串</color>
</return>
</getCatsByUserResponse>
2.实现类部分文档
我们回到之前的路径http://127.0.0.1:8082/sayHi?wsdl:
上面我们访问的http://127.0.0.1:8082/sayHi?wsdl=1是接口类的定义文档,所以上面<import/>是接口的定义,下面的<binding>和<service>标签是Service的实现。
binding中绑定了可操作的方法,以及输入输出参数。
service中定义了该WebService对外提供的服务接口地址。
所以整个WSDL的文档结构就是:
通俗的说,WSDL文档描述了WebService如下3个方面:
--what:该WebService包含“什么”操作。
--how:该WebService的操作应该“怎么”调用。
--where:该WebService的服务地址。
调用一次WebService的本质:
1.客户端把调用方法参数,转换成XML文档片段(SOAP消息,input消息),该文档片段必须符合WSDL定义的格式。
2.通过网络,把XML文档片段从客户端传送给服务器。
3.服务器接收到XML文档片段。
4.服务器解析XML片段,提取其中的数据,并把数据转换成调用WebService所需要的参数值。
5.服务器执行方法。
6.把执行的方法得到的返回值,再次转换生成为XML文档片段(SOAP,output消息),该文档片段必须符合WSDL定义的格式。
7.通过网络,把XML文档片段传送给客户端。
8.客户端接收到XML文档片段。
9.客户端解析XML片段,提取其中的数据,并把数据转换成调用WebService所需要的返回值。
从上面调用本质来看,要一个语言支持WebService,唯一的要求就是:该语言支持XML文档解析、生成、支持网络传输。
只要得到WebService文档,程序就可以调用WebService。
转载请注明出处:http://blog.csdn.net/acmman/article/details/52179346