• WSDL-学习总结


    1.什么是WSDL

      是一种使用 XML 编写的文档。这种文档可描述某个 Web service。它可规定服务的位置,以及此服务提供的操作(或方法)。

    2.WSDL文档结构:

    <binding> web service 使用的通信协议;为每一个<protTypes>定义消息格式和通信协议;有services引用;
    <portType> web service 可以执行的操作(operation)相当于一个函数库,其中定义的每一个操作可以被看做是一个函数;被binding调用;
    <message> web service 使用的消息;被operation调用,相当于函数的参数,有入参(input)和出参(output);message中的part,指定函数中的参数名和参数类型;
    <types> web service 使用的数据类型;被<message>调用;在<types>中定义了元素以及元素的类型;

    以GetServices为例

    ////////////////////////////////<types>
    <wsdl:types>
    <xs:schema targetNamespace="http://www.onvif.org/ver10/device/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" elementFormDefault="qualified" version="18.12"> <xs:import namespace="http://www.onvif.org/ver10/schema" schemaLocation="../../../ver10/schema/onvif.xsd"/> <!--===============================--> <xs:element name="GetServices"> <xs:complexType> <xs:sequence> <xs:element name="IncludeCapability" type="xs:boolean"> <xs:annotation> <xs:documentation>Indicates if the service capabilities (untyped) should be included in the response.</xs:documentation> </xs:annotation> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="GetServicesResponse"> <xs:complexType> <xs:sequence> <xs:element name="Service" type="tds:Service" maxOccurs="unbounded">    //这里需要注意的是,"type= "tds:Service""指定的类型是下面的complexTpye name = "Service" <xs:annotation> <xs:documentation>Each Service element contains information about one service.</xs:documentation> </xs:annotation> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <!--===============================--> <xs:complexType name="Service">  //自定义一种复杂的数据类型 “Service”,请求消息或者响应消息时需要严格按照数据类型格式; <xs:sequence> <xs:element name="Namespace" type="xs:anyURI">      //这里的“anyURL”是xml schmea中的杂项数据类型,表示Namespace元素值可以是任意类型的URI; <xs:annotation> <xs:documentation>Namespace of the service being described.</xs:documentation> </xs:annotation> </xs:element> <xs:element name="XAddr" type="xs:anyURI"> <xs:annotation> <xs:documentation>The transport addresses where the service can be reached.</xs:documentation> </xs:annotation> </xs:element> <xs:element name="Capabilities" minOccurs="0">  //表示<Capabilities>元素最少可以出现0次;如果不明确声明出现的次数,则元素最少出现一次,最多出现一次 <xs:complexType> <xs:sequence> <xs:any namespace="##any" processContents="lax"> <xs:annotation> <xs:documentation>The placeholder for the service capabilities.</xs:documentation> </xs:annotation> </xs:any> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Version" type="tt:OnvifVersion"> <xs:annotation> <xs:documentation>The version of the service (not the ONVIF core spec version).</xs:documentation> </xs:annotation> </xs:element> <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> //<any> 元素使我们有能力可以使用未被 schema 规定的元素来拓展 XML 文档! </xs:sequence> <xs:anyAttribute processContents="lax"/> //<anyAttribute> 元素使我们有能力使用未被 schema 规定的属性来扩展 XML 文档! </xs:complexType> </wsdl:types> ///////////////////////////////<message> <wsdl:message name="GetServicesRequest"> <wsdl:part name="parameters" element="tds:GetServices"/> //把massage定义了操作的参数:part则是定义的参数; </wsdl:message> <wsdl:message name="GetServicesResponse"> <wsdl:part name="parameters" element="tds:GetServicesResponse"/> </wsdl:message> ///////////////////////////////<portType> <wsdl:portType name="Device"> <wsdl:operation name="GetServices"> <wsdl:documentation>Returns information about services on the device.</wsdl:documentation> <wsdl:input message="tds:GetServicesRequest"/> <wsdl:output message="tds:GetServicesResponse"/> </wsdl:operation> </wsdl:portType> ////////////////////////////////<binding> <wsdl:binding name="DeviceBinding" type="tds:Device"> //指向binding的端口,此处指向“Device”; <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> //style取值只能为“rpc”或者“document”;transport定义了要使用的SOAP协议,这里使用http; <wsdl:operation name="GetServices"> <soap:operation soapAction="http://www.onvif.org/ver10/device/wsdl/GetServices"/> //定义了每个端口提供的操作符; <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding>

     下图概要描述了<binding>,<message>,<types>,<portTypes>之间的关系

      1.箭头连接符代表文档不同栏之间的关系。

      2.点和箭头代表了引用或使用关系。

      3.双箭头代表"修改"关系。

      4.3-D的箭头代表了包含关系。

    这样,

      各Messages栏使用Types栏的定义;

         PortTypes栏使用Messages栏的定义;

      Bindings栏引用了PortTypes栏;

      Services栏引用Bindings栏;

      PortTypes和Bindings栏包含了operation元素,而Services栏包含了port元素。

      PortTypes栏里的operation元素由Bindings栏里的operation元素进一步修改或描述。

  • 相关阅读:
    NET CORE 数据库迁移
    VUE3.0 解析svg文件
    关于ElementUI的样式不生效
    git命令
    vue 2.x的跨域问题
    Putty 重新启动 linux sqlserver服务
    aspnetcore之session
    Syncfusion 在 core 的架构
    TortoiseSVN创建/合并分支
    正则表达式知识点整理
  • 原文地址:https://www.cnblogs.com/weiyouqing/p/10661990.html
Copyright © 2020-2023  润新知