【学习心得】WebService 从入门到有点东西(理论篇-WSDL)

理论篇

  • 简介

    1. 定义(最讨厌缩写了,特别是在接触5G的时候,但是为了方便,还是莫得办法的。我自己的方法是先把全称搞下来,理解一遍 ——所以此文除了众所周知的专有名词,所有缩写几乎都有全称及翻译)。Web Service 顾名思义,即网络服务,是跨语言、跨平台的远程调用技术。Web Service 技术主体为 XML + XSD,SOAP,WSDL。XML为封装数据的载体,XSD用来描述数据类型。
    2. 目的。主要需求来源有二,之一为提供公用的服务,如天气服务,验证码,翻译等。之二为实现不同系统的数据交换。
    3. 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对应)

无情链接:贴一个天气服务的WSDL,供读者深入理解学习

  • UDDI

注册和搜索 web 服务。

  • SOAP

    SOAP,Simple Object Access Protocol(简单对象访问协议),基于HTTP协议,可以理解为HTTP + XML。
    SOAP消息的基本结构:

<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消息。

你可能感兴趣的:(日常编程)