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>

  • 相关阅读:
    halcon算子翻译——append_channel
    halcon算子翻译——access_channel
    halcon算子翻译——set_framegrabber_param
    halcon算子翻译——set_framegrabber_lut
    halcon算子翻译——set_framegrabber_callback
    halcon算子翻译——open_framegrabber大恒相机
    在循环中使用break案例
    for、while、do while 3种循环异同点
    do while循环
    while循环案例
  • 原文地址:https://www.cnblogs.com/dlsunf/p/8592127.html
Copyright © 2011-2022 走看看