理论篇
-
简介
- 定义(最讨厌缩写了,特别是在接触5G的时候,但是为了方便,还是莫得办法的。我自己的方法是先把全称搞下来,理解一遍 ——所以此文除了众所周知的专有名词,所有缩写几乎都有全称及翻译)。Web Service 顾名思义,即网络服务,是跨语言、跨平台的远程调用技术。Web Service 技术主体为 XML + XSD,SOAP,WSDL。XML为封装数据的载体,XSD用来描述数据类型。
- 目的。主要需求来源有二,之一为提供公用的服务,如天气服务,验证码,翻译等。之二为实现不同系统的数据交换。
- Client & Server。通过WSDL知悉服务,Client 发送服务请求,Server端接受请求并处理,返回response给Client,Client接收此回复。
-
WSDL
WSDL,Web Services Description Language(Web Service描述语言)用XML的形式以描述网络服务,如网络服务提供的方法,所需的参数和返回的参数等。
WSDL的文档结构如下(说明比较多,先大概浏览一下,可以和下文的实例进行代入学习):
<definitions>
<types>
主要定义消息的数据类型。
</types>
<message>
定义交互消息,如入参,出参。消息中包含一个或多个部件part
<part>
部件中的内容就是types中的内容。
</part>
</message>
<portType>
操作集合
<operation>
<document>
说明
</document>
<input>
定义入参,这里的参数就是message。
</input>
<output>
定义返回结果,这里的参数也是message。
</output>
</operation>
</portType>
<binding>
定义通信协议,如SOAP,HTTPGet,HTTPPost
</binding>
</definitions>
实例:
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://WebXml.com.cn/">
<s:element name="getWeatherbyCityNamePro">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="theCityName" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="theUserID" type="s:int"/>
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
</wsdl:types>
<wsdl:message name="getWeatherbyCityNameProSoapIn">
<wsdl:part name="parameters" element="tns:getWeatherbyCityNamePro"/>
</wsdl:message>
上面是获取天气的一个文档片段,第一个element:getWeatherbyCityNamePro指明了getWeatherbyCityNameProSoapIn消息的部件,即获取天气的入参,参数是两个,类型分别为string和int。
<message name="getCityRequest">
<part name="ProvinceName" type="xs:string"/>
**-- 入参为省份名,类型为string**
</message>
<message name="getCityResponse">
<part name="cityList" element="tns:ArrayOfString"/>
**-- 出参:城市列表,类型:string数组**
</message>
<portType name="WebServiceSoap">
**-- 端口名**
<operation name="getCity">
**-- 操作名:getCity 提供给Client查询城市服务**
<input message="getCityRequest"/> --
**-- 定义入参为getCityRequest,这里的入参就是message(到这里可以理解了吧,message就是定义CS两端通信的消息)**
<output message="getCityResponse"/>
**-- 定义出参为getCityResponse,这里的入参也是message
</operation>
</portType>
portType操作类型,WSDL提供了四种:
按照服务端和客户端分类,
服务端:
- One-way 此操作可接受消息,但不会返回响应。如接收一个插入日志的请求,不返回响应。示例如下:insertLog只有一个input节点,没有output。
<message name="newLogValues">
<part name="log" type="xs:string"/>
<part name="value" type="xs:string"/>
</message>
<portType name="glossaryLogs">
<operation name="insertLog">
<input name="newLog" message="newLogValues"/>
</operation>
</portType >
- Request-response 此操作可接受一个请求并会返回一个响应。如接收一个查询城市列表的请求,会返回一个包含城市数组的响应。示例如下:getTerm有input和ouput节点。
<message name="getTermRequest">
<part name="term" type="xs:string"/>
</message>
<message name="getTermResponse">
<part name="value" type="xs:string"/>
</message>
<portType name="glossaryTerms">
<operation name="getTerm">
<input message="getTermRequest"/>
<output message="getTermResponse"/>
</operation>
</portType>
客户端:
- Solicit-response 此操作可发送一个请求,并会等待一个响应。Solicit是索求的意思,可以容易地理解为客户端向服务端索求,既然索求,那就会等待它的响应。比如发送一个查询城市列表的请求,并等待服务端返回数据。(示例与服务端的Request-response对应)
- Notification 此操作可发送一条消息,但不会等待响应。notification是通知的意思,也就是说我只负责拿个大喇叭跟你喊:谁TM买小米儿。如发送一个插入日志的请求,不用等待响应,插就完事了。(示例与服务端的One-way对应)
注册和搜索 web 服务。
<? xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Header>
...
...包含头部信息的 XML 标签
...
</soap:Header>
<soap:Body>
...
...包含所有的调用和响应的主体信息的标签
...
<soap:Fault>
...
...错误信息标签
...
</soap:Fault>
</soap:Body>
</soap:Envelope>
Envelope 元素是SOAP消息的根元素,指明该XML文档为SOAP消息。