<wsdl:definitions 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:ns1="http://org.apache.axis2/xsd"
xmlns:ns="http://impl.service.utcs.ctc"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:ax21="http://beans.service.utcs.ctc/xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
targetNamespace="http://impl.service.utcs.ctc">
<wsdl:documentation>UtcsClient</wsdl:documentation>
 Types 是一个数据类型定义的容器。Element元素定义在消息(message)定义中需要的XML元素的类型定义。complexType 元素定义了XML元素由哪些具体的类型组成以及组成元素的顺序。 complexType元素如果放在Types元素下面而又不被element元素包含,那么它就定义了一个公用的数据类型。可以被多个element元素所引用
<wsdl:types>
<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://beans.service.utcs.ctc/xsd">
<xs:complexType name="CrossControlMode"> <!- 定义一个 CrossControlMode类 这个类有三个属性crossID,value,sHeadPackage ->
<xs:sequence>
<xs:element minOccurs="0" name="crossID" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="value" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="sHeadPackage" nillable="true" type="ax21:HeadPackage"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="HeadPackage">
<xs:sequence>
<xs:element minOccurs="0" name="from" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="seq" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="to" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="token" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="type" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="version" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="CrossCycle">
<xs:sequence>
<xs:element minOccurs="0" name="crossID" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="lastCycleLen" type="xs:short"/>
<xs:element minOccurs="0" name="startTime" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="sHeadPackage" nillable="true" type="ax21:HeadPackage"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="CrossParam">
<xs:sequence>
<xs:element minOccurs="0" name="crossID" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="crossName" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="detID" nillable="true" type="xs:string"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="detIDList" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="feature" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="isKey" type="xs:short"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="laneNoList" nillable="true" type="xs:short"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="phaseNoList" nillable="true" type="xs:short"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="planNoList" nillable="true" type="xs:short"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="stageNoList" nillable="true" type="xs:short"/>
<xs:element minOccurs="0" name="sHeadPackage" nillable="true" type="ax21:HeadPackage"/>
</xs:sequence>
</xs:complexType>
WSDL: Web 服务描述语言(Web Services Descirption Language).

a. 服务提供者是通过web服务描述将所有用于调用Web服务的规范传送给服务请求者的。
b. WSDL是通过标准的XML格式来描述Web服务。
c. 它用一种与实现语言无关的抽象方式定义了web服务的操作和消息。
d. 操作和消息被抽象描述,然后绑定到具体的网络协议和端点。
e. web服务包含了一组抽象的端点。 WSDL概念模型:
1. 服务做些什么: 服务所提供的操作(方法)。 对应porttype,operation元素。
2. 如何访问服务: 数据格式详情(types,message)及访问服务操作的必要协议(Binding)。
3. 服务位于何处: 由特定协议约定的网络地址。如URL。 (service,port)。 WSDL的组成元素
1.  Types 是一个数据类型定义的容器。Element元素定义在消息(message)定义中需要的XML元素的类型定义。complexType 元素定义了XML元素由哪些具体的类型组成以及组成元素的顺序。 complexType元素如果放在Types元素下面而又不被element元素包含,那么它就定义了一个公用的数据类型。可以被多个element元素所引用。 例如:
<wsdl:types>
  <xsd:schema
    targetNamespace=""
    xmlns=""
    xmlns:wsdl=""
    elementFormDefault="qualified">
    <xsd:complexType name="Transaction">
    <xsd:sequence>
     <xsd:element minOccurs="1" maxOccurs="1"
            name="number" type="xsd:int" />
     <xsd:element minOccurs="0" maxOccurs="1"
            name="checknumber" type="xsd:int" />
     <xsd:element minOccurs="1" maxOccurs="1"
            name="date" type="xsd:date" />
     <xsd:element minOccurs="1" maxOccurs="1"
            name="header" type="xsd:string" />
     <xsd:element minOccurs="1" maxOccurs="1"
            name="amount" type="xsd:float" />
    </xsd:sequence>
   </xsd:complexType>
  这是一个复杂类型的定义,这个有点像定义了一个叫做Transaction的类,而这个类有属性number,checknumber,date,header和amount。这里定义了一个公用的数据类型结构。
  <xsd:element name="LookupTransactionsResponse">
    <xsd:complexType>
     <xsd:sequence>
      <xsd:element minOccurs="0" maxOccurs="unbounded"
             name="transactions" type="xsd1:Transaction" />
     </xsd:sequence>
    </xsd:complexType>
   </xsd:element> 这里定义了一个数据类型元素(element)叫做LookupTransactionsResponse,在这里引用了前面定义的Transaction的集合. 在后面的消息定义中将会引用到这里所定义的数据类型元素。    <xsd:element name="LookupTransactions">
    <xsd:complexType>
     <xsd:sequence>
      <xsd:element minOccurs="1" maxOccurs="1"
             name="accountNumber" type="xsd:int" />
      <xsd:element minOccurs="0" maxOccurs="1"
             name="date1" type="xsd:date" />
      <xsd:element minOccurs="0" maxOccurs="1"
             name="date2" type="xsd:date" />
      <xsd:element minOccurs="1" maxOccurs="1"
             name="token" type="xsd:base64Binary" />
     </xsd:sequence>
    </xsd:complexType>
   </xsd:element> 这里定义的数据类型是一个参数列表,它有accountNumber,date1,date2,token组成。类似于 SomeObject.lookupTransactions(accountNumber,date1,date2,token) 里面的参数列表。complexType 定义在了element里面,那么这个数据类型结构只能是LookupTransactions 私有的了。
  </xsd:schema>
</wsdl:types> 2.  Message具体定义了在通信中使用的消息的数据结构。什么叫通信中使用?因为WSDL是给调用服务的人看的。那我要调用你的服务,我的soap请求消息应该怎么写呢,格式是什么呢?这里就给出定义了。
  <wsdl:message name="LookupTransactionsResponse">
    <wsdl:part name="parameters" element="xsd1:LookupTransactionsResponse" />
   </wsdl:message>   这里定义了服务在调用之后消息返回的数据格式。其名字为parameters,数据的类型就是xsd1:LookupTransactionsResponse。
  <wsdl:message name="LookupTransactions">
    <wsdl:part name="parameters" element="xsd1:LookupTransactions" />
   </wsdl:message> 这里定义了访问服务时需要传什么样的数据。
  3.  PortType 具体定义了一个服务可以访问的接口。是对于某个端口类型所支持操作的抽象集合。其实就是说服务定义了多少个可以被调用的方法。
  这里面有两层意思:第一,针对某个端口(porttype),如soap端口类型,http端口类型。端口可以包含任意数量的操作。第二,定义了服务所拥有的操作(operation)。 <wsdl:portType name="OnlineBankingPortType">
  <wsdl : peration name="LookupTransactions">
   <wsdl:input message="tns:LookupTransactions" />
   <wsdl : utput message="tns:LookupTransactionsResponse" />
  </wsdl : peration>
</wsdl:portType>
这里定义了一个可以访问的方法LookupTransactions。这个方法的入参,又叫入站消息吧是message里面定义的tns:LookupTransactions。 同时这个方法还有一个返回对象,又叫出战消息,是message里面所定义的tns:LookupTransactionsResponse
  <wsdl:portType name="ChinaStockWebServiceSoap">
     <wsdl : peration name="getStockImageByCode">
      <wsdl:documentation  
       xmlns:wsdl="">
        sdf
      </wsdl:documentation>   
      <wsdl:input message="tns:getStockImageByCodeSoapIn" />   
      <wsdl : utput message="tns:getStockImageByCodeSoapOut" />
     </wsdl : peration>
   </wsdl:portType>
  <wsdl:portType name="ChinaStockWebServiceHttpPost">
    <wsdl : peration name="getStockImageByCode">
     <wsdl:documentation xmlns:wsdl="">
      test
     </wsdl:documentation>
    <wsdl:input message="tns:getStockImageByCodeHttpPostIn" />
    <wsdl : utput message="tns:getStockImageByCodeHttpPostOut" />
    </wsdl : peration>
   </wsdl:portType>    这个例子就定义了两个端口类型soap和httppost。
  Types,Message和PortType抽象地描述了是如何调用webservice的,与具体的web服务部署无关。注意这里全部用的是wsdl的命名空间。没有用到soap的命名空间。在后面的绑定和部署就会用到soap消息的命名空间了。 4. Binding 定义了某个PortType与某个具体的网络传输协议或是消息传输协议的绑定。 <wsdl:binding name="OnlineBankingPortBinding"
        type="tns:OnlineBankingPortType">
  <soap:binding transport=""
         />
  <wsdl : peration name="LookupTransactions">
   <soap : peration soapAction=""
           />
    <wsdl:input>
     <soap:body use="literal" />
    </wsdl:input>
    <wsdl : utput>
     <soap:body use="literal" />
    </wsdl : utput>
  </wsdl : peration>
</wsdl:binding> 前面所定义的端口类型OnlineBankingPortType 绑定在 soap/http协议上面了。这里用到soap的命名空间进行了绑定。
Soap:binding :指出绑定是针对soap协议格式的。Transport指定了传输协议。Style指定通信风格。有“rpc”和“document”两种风格。
Soap : peration :为SOAP服务操作提供消息。通常可以指明此操作的SOAPActionHTTP头。
Soap:body :指出消息如何在SOAP BODY元素中表现。
 
5.  Service 一个服务所有访问入口的部署细节。一个Service往往包含多个访问入口(如URL),每个访问入口都会使用一个port来描述。
6.  Port 描述一个服务访问入口的部署细节。由哪个web地址(URL)来访问,绑定到什么样的端口上面。
   <wsdl:service name="OnlineBankingService">
    <wsdl:port name="OnlineBankingPort" binding="tns:OnlineBankingPortBinding">
     <soap:address location="http://localhost:8080/axis2/services/OnlineBankingService" />
    </wsdl:port>
   </wsdl:service>    Soap:address 为SOAP服务访问指定的网络地址。   下面的例子就定义了多个访问端口。
  <wsdl:service name="ChinaStockWebService">
  <wsdl:documentation xmlns:wsdl="">
   test
  </wsdl:documentation>
  <wsdl:port name="ChinaStockWebServiceSoap"
   binding="tns:ChinaStockWebServiceSoap">
   <soap:address
    location="" />
  </wsdl:port>
  <wsdl:port name="ChinaStockWebServiceSoap12"
   binding="tns:ChinaStockWebServiceSoap12">
   <soap12:address
    location="" />
  </wsdl:port>
  <wsdl:port name="ChinaStockWebServiceHttpGet"
   binding="tns:ChinaStockWebServiceHttpGet">
   <http:address
    location="" />
  </wsdl:port>
  <wsdl:port name="ChinaStockWebServiceHttpPost"
   binding="tns:ChinaStockWebServiceHttpPost">
   <http:address
    location="" />
  </wsdl:port>
</wsdl:service>
  客户端测试代码:
public class OnlineBankAXIOMClient {
  private static EndpointReference targetEPR =
    new EndpointReference(
               "http://localhost:8088/ums/services/OnlineBankingService");
  public static OMElement getLoginPayload(String usernamestr,String passswordstr) {
    OMFactory fac = OMAbstractFactory.getOMFactory();
   
    //命名空间必须是,
    //而不是
    //因为这里是定义消息格式的命名空间。在Types元素里面的定义是
    //<wsdl:types>
    //<xsd:schema
    //targetNamespace=""
    //.......
    //所以数据类型的定义的命名空间就是""
    OMNamespace omNs = fac.createOMNamespace(
                         "", "tns");
    OMElement method = fac.createOMElement("login", omNs);
    OMElement username = fac.createOMElement("username", omNs);
    username.addChild(fac.createOMText(username, usernamestr));
    method.addChild(username);
    
    OMElement password = fac.createOMElement("password", omNs);
    password.addChild(fac.createOMText(password, passswordstr));
    method.addChild(password);
   
    return method;
  }
 
  public static void main(String[] args) {
    try {
      OMElement payload = getLoginPayload("dragon","123");
      Options options = new Options();
      options.setTo(targetEPR);
     
      //这里必须配置SOAPAction=;
      //否则就会报“org.apache.axis2.AxisFault:
      //The endpoint reference (EPR) for the Operation not found is
      //http://localhost:8088/ums/services/OnlineBankingService and the WSA Action = urn:anonOutInOp”
      //的错误.
      //而且必须跟WSDL里面定义的一致
      //<wsdl : peration name="Login">
      //<soap : peration soapAction=""
      ///     />       options.setAction("");
      options.setExceptionToBeThrownOnSOAPFault(true);
      options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
  ServiceClient sender = new ServiceClient();
      sender.setOptions(options);       OMElement result = sender.sendReceive(payload);
  String response = result.getFirstElement().getText();
      System.out.println("if login is valid: " + response);
  } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
小结:
1. 想要很好地运用AXIOM写客户端程序,必须要充分熟悉WSDL规范的定义。
2. 注意命名空间。
3. 采用自底向上的实现(code-->WSDL)方法虽然开发轻松,但是很多知识点会弄不清楚。
采用自顶向下的实现(WSDL-->code)方法可控性更强,可以更好地掌握知识点。

wsdl详解的更多相关文章

  1. Web Service学习之五:WSDL详解

    WSDL是Web Service定义文档,不同平台 不同语言实现Web Service遵循的共同协议 ,在解析XML时按照各自语言的特点解析成相应的具体类.方法.参数和数据类型. WSDL是一个XML ...

  2. WebService中的WSDL详解 及jmeter测试

    首先简单讲解一下什么是wsdl.        一个WSDL文档通常包含8个重要的元素,即definitions.types.import.message.portType.operation.bin ...

  3. Webservice学习之WSDL详解

    1. <definitions/> 这部分在基础篇里已经介绍,主要说明引用了哪些schema以及schema的位置等,可以看下基础篇的介绍,SayHello的Demo这部分内容如下: &l ...

  4. WebService 之 WSDL详解

    WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务 ...

  5. WSDL详解(一)

    WSDL文档使用web服务描述语言来定义服务. 文档包括逻辑(抽象)部分和具体部分. 抽象部分用于定义独立于实现的数据类型和消息,具体部分定义一个endpoint如何实现一个可以与外界进行交互的服务. ...

  6. WebService核心之WSDL深入详解

    WebService核心之WSDL深入详解 根据上一篇文章开发的Web Service实例生成的WSDL文档如下: XML里两个属性介绍: targetNamespace          相当于ja ...

  7. 基础拾遗------webservice详解

    基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

  8. WebConfig配置文件详解

    今天看到博客园一位朋友整理的一个WebConfig配置文件详解,觉得不错,转载一下: <?xml version="1.0"?> <!--注意: 除了手动编辑此文 ...

  9. WebConfig节点详解

    <!-- Web.config配置文件详解(新手必看) 花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法. 很适合新手参看,由于Web.config在使用很灵活,可 ...

随机推荐

  1. Kubernetes设计架构

    官方文档:https://www.kubernetes.org.cn/doc-11 Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc), ...

  2. 微信小程序wx.chooseImage和wx.previewImage的综合使用(图片上传不限制最多张数)

    WXML: <view class="weui"> <view class="weui-uploader"> <view clas ...

  3. beaglebone-black reference url

    reference : https://github.com/beagleboard/beaglebone-black/wiki/System-Reference-Manual https://bea ...

  4. .Net在线编辑器:KindEditor及CkEditor+CkFinder配置说明

    Net在线编辑器:KindEditor及CkEditor+CkFinder配置说明 一.KindEditor(免费) KindEditor是一套开源的HTML可视化编辑器,主要用于让用户在网站上获得所 ...

  5. 链表(list)的实现(c语言)

    链表是一种基本的数据结构,今天练习了一下,所以将代码贴在下面,代码测试通过,代码还可以优化,我会过段时间就会增加一部分或者优化一部分直达代码无法优化为止,我的所有数据结构和算法都会用这样的方式在博客上 ...

  6. python笔记03:使用字符串

    3.1 基本字符串操作: 所有的标准序列操作(索引,分片,乘法,判断成员资格,求长度,取最小值,取最大值)对于字符串同样有效.但是,请记住:字符串都是不可变的 3.2 字符串格式化:精简版 字符串格式 ...

  7. DevExpress DateEdit 5 常见问题解决方法

    1. 如何设置选择的日期大于当天? dateEdit1.Properties.MinValue = DateTime.Now.AddDays(1) 2. 如何做到只显示年.月? var formatS ...

  8. windows 自动copy远程服务器文件

    net use h: \\123.45.67.000\T1dbbackup 123456/user:administrator ------远程服务器IP123.45.67.000  .T1dbbac ...

  9. 网络编程(socket,套接字)

    服务端地址不变 ip + mac 标识唯一一台机器 ip +端口 标识唯一客户端应用程序 套接字: 网络编程   网络编程 一.python提供了两个级别访问的网络服务 低级别的网络服务支持基本的 S ...

  10. utf-8和Unicode的区别

    链接 utf-8和Unicode到底有什么区别?是存储方式不同?编码方式不同?它们看起来似乎很相似,但是实际上他们并不是同一个层次的概念 要想先讲清楚他们的区别,首先应该讲讲Unicode的来由. 众 ...