zoukankan      html  css  js  c++  java
  • 学习 WebService 第二步:知识准备——WSDL文件解析

    原文地址:https://www.cnblogs.com/yzw23333/p/7245104.html

    Web service中一个 WSDL 对应一个 web service地址

    可以想象成一个商店,商店里面出售很多手机(portTypes),每个手机上有很多功能(opeations),每个功能对应很多输入和输出参数(message)  

    • 这里没有类,只有端口。portTypes
    • 没有方法,只有端口里面的操作。opeations
    • 没有参数,只有传递给端口中某个操作的消息。message

    一、WSDL文件解析

    xml文档第一句:

    definitions--WSDL文档的根元素,该元素的属性指明了WSDL文档的名称name

    文档的目标名字空间targetNamespace,以及WSDL文档应用的名字空间的速记定义。

    它指明了此WebService的名称为:HelloWorldService

    <?xml version="1.0" encoding="UTF-8"?>

    <wsdl:definitions xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://test.demo1/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="HelloWorldService" targetNamespace="http://test.demo1/">

    <wsdl:types>

    <xs:schema xmlns:tns="http://test.demo1/" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" targetNamespace="http://test.demo1/" version="1.0">

    这部分是数据类型的定义,其中为定义了两个元素的结构:

    • sayHello(请求参数的类型): 将该元素定义为包含一个字符串string元素(arg0)的复合类型元素。
    • sayHelloResponse(响应参数的类型):  将该元素定义为包含一个字符串string元素(return)的复合类型元素。

    其中的name="arg0", name="return"中的“arg0”,“return”是可以指定的,因为HelloWorld输入输出参数都是使用的默认的参数名,所以生成的xml是这样子。

    <xs:element name="sayHello" type="tns:sayHello"/>

    <xs:element name="sayHelloResponse" type="tns:sayHelloResponse"/>

    <xs:complexType name="sayHello">

    <xs:sequence>

      <xs:element minOccurs="0" name="arg0" type="xs:string"/>

    </xs:sequence>

    </xs:complexType>

    <xs:complexType name="sayHelloResponse">

    <xs:sequence>

      <xs:element minOccurs="0" name="return" type="xs:string"/>

    </xs:sequence>

    </xs:complexType>

    </xs:schema>

    </wsdl:types>

    其中的name="arg0", name="return"中的“arg0”,“return”是可以指定的,因为HelloWorld输入输出参数都是使用的默认的参数名,所以生成的xml是这样子。

    如果HelloWorld接口中的方法修改成

    1 public @WebResult(name="responseResult")String sayHello(@WebParam(name="name")String name) ;  
     也就是给输入参数与返回结果指定一个选定的名字,则生成的xml如下所示:
     1 <xs:complexType name="sayHello">  
     2   <xs:sequence>  
     3     <xs:element minOccurs="0" name="name" type="xs:string"/>  
     4   </xs:sequence> 
     5 </xs:complexType>  
     6 <xs:complexType name="sayHelloResponse">  
     7   <xs:sequence>  
     8     <xs:element minOccurs="0" name="responseResult" type="xs:string"/>  
     9   </xs:sequence>  
    10 </xs:complexType> 

    下面这部分是消息格式的抽象定义,其中定义了两个消息格式

    • sayHelloResponse( 响应消息格式 ): 由一个消息片断组成,该消息片断的名字是parameters,包含的具体元素类型sayHelloResponse
    • sayHello( 请求消息格式 ) : 由一个消息片断组成,该消息片断的名字是 parameters,包含的具体元素类型sayHello

    <wsdl:message name="sayHelloResponse">

    <wsdl:part element="tns:sayHelloResponse" name="parameters">

    </wsdl:part>

    </wsdl:message>

    <wsdl:message name="sayHello">

    <wsdl:part element="tns:sayHello" name="parameters">

    </wsdl:part>

    </wsdl:message>

    portType---描述服务逻辑接口operation元素的集合。HelloWorld只有一个操作sayHello.

    这部分定义了服务访问点的调用模式的类型,表明 HelloWorld ServicesayHello入口类型是请求/响应模式请求消息是sayHello,而响应消息是sayHelloResponse

    <wsdl:portType name="HelloWorld">

    <wsdl:operation name="sayHello">

    <wsdl:input message="tns:sayHello" name="sayHello">

    </wsdl:input>

    <wsdl:output message="tns:sayHelloResponse" name="sayHelloResponse">

    </wsdl:output>

    </wsdl:operation>

    </wsdl:portType>

    binding---一个endpoint的实际数据格式说明,一个binding元素定义如何将一个抽象消息映射到一个具体数据格式。该元素指明诸如参数顺序,返回值等信息。           

    每个被支持的信息格式和信息传送方式组合,就叫做 binding  (soap:binding 就是用 soap语言通话  )

    这段xml定义的操作“sayHello使用的是SoapDocumentProtocol消息格式(style="document")。输入和输出参数格式都是“Literal”(use="literal"

    <wsdl:binding name="HelloWorldServiceSoapBinding" type="tns:HelloWorld">

    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

    <wsdl:operation name="sayHello">

    <soap:operation soapAction="" style="document"/>

    <wsdl:input name="sayHello">

      <soap:body use="literal"/>

    </wsdl:input>

    <wsdl:output name="sayHelloResponse">

      <soap:body use="literal"/>

    </wsdl:output>

    </wsdl:operation>

    </wsdl:binding>

    找到名为“HelloWorldService”的service具体定义如下所示:

    service---相关port元素的集合,用户组织endpoint定义。

    port--通过binding和物理地址定义的endpoint,这个元素将所有抽象定义聚集在一起。

    这部分是具体的Web服务的定义,在这个名为 HelloWorldService的Web服务中,

    提供了一个服务访问入口访问地址是"http://localhost:8080/helloWorld",

    使用的消息模式是由前面的binding “HelloWorldServiceSoapBindin”所定义的。

    <wsdl:service name="HelloWorldService">

      <wsdl:port binding="tns:HelloWorldServiceSoapBinding" name="HelloWorldPort">

        <soap:address location="http://localhost:8080/helloWorld"/>

      </wsdl:port>

    </wsdl:service>

    </wsdl:definitions>

    二、请求及响应的具体消息格式解析

    • 请求消息

    - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://test.demo1/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
    - <soapenv:Body>  
    - <q0:sayHello>  
      <arg0>xxl</arg0>   
      </q0:sayHello>  
      </soapenv:Body>  
      </soapenv:Envelope>

    • 响应消息

    - <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
    - <soap:Body>  
    - <sayHelloResponse xmlns:ns2="http://test.demo1/">  
      <return>hello xxl</return>   
      </sayHelloResponse>  
      </soap:Body>  
      </soap:Envelope>

  • 相关阅读:
    《DSP using MATLAB》 示例 Example 9.12
    《DSP using MATLAB》示例 Example 9.11
    《DSP using MATLAB》示例 Example 9.10
    《DSP using MATLAB》示例Example 9.9
    《DSP using MATLAB》示例 Example 9.8
    《DSP using MATLAB》示例Example 9.7
    《DSP using MATLAB》示例 Example 9.6
    《DSP using MATLAB》示例Example 9.5
    《DSP using MATLAB》示例 Example 9.4
    (转载)【C++11新特性】 nullptr关键字
  • 原文地址:https://www.cnblogs.com/dlsunf/p/8592127.html
Copyright © 2011-2022 走看看