手写 WSDL(转)

2016/01/01 Java

WSDL 是一种服务调用规范。

两种方式

使用php编写WebService时,有两种方式:

  1. 不使用wsdl文件。采用这种方式时,只有php脚本能访问WebService
  2. 使用wsdl文件。采用这种方式时,无论哪个平台,采用什么语言,都可以通过wsdl文件来访问WebServicewsdl文件就相当于Client端和Server端之间的通信契约。另外,在wsdl文件中还可以指定消息传输的方式,比如SoapHTTP GETHTTP POST等。

下面主要介绍如何手写一个wsdl文件。 wsdl文件其实就是一个xml格式的纯文本文件。它有一个根标签wsdl:definitions,在其属性中指定了用到的命名空间。为了便于以后扩展,建议将以下的命名空间全部加上。

<wsdl:definitions 
            xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
            xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
            xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
            xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
            xmlns:tns="http://tempuri.org/Test/"
            xmlns:s="http://www.w3.org/2001/XMLSchema"
            xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
            xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
            targetNamespace="http://tempuri.org/Test/"
            xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
</wsdl:definitions>

其中,targetNamespace="http://tempuri.org/Test/"xmlns:tns="http://tempuri.org/Test/"共同指定了本文件中的自定义标签和属性的命名空间。 这两个属性的值必须完全相同,字符串Test可以修改,不同的WebService有不同的值。xmlns:tns中的tns也可以修改成其他的值,修改后下面使用的地方必须与其保持一致。 根标签下面主要包括五个部分的内容,分别是:类型定义、消息定义、端口定义、绑定和服务。下面分别进行介绍:

类型定义

这部分内容包含在一个wsdl:types标签中,主要定义消息中需要用到的数据类型, 采用W3C XML模式内置类型作为其基本类型系统 。关于数据类型的介绍,可以参考这篇文章:http://www.cnblogs.com/newsouls/archive/2011/10/28/2227765.html

wsdl:types标签下有一个s:schema子标签,所有自定义数据类型都放在这个子标签下。示例代码如下:

<wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/Test/">
        <s:complexType name="DepartmentInfo">
            <s:sequence>
                  <s:element minOccurs="1" maxOccurs="1" name="index" type="s:int" />
                  <s:element minOccurs="1" maxOccurs="1" name="id" type="s:string" />
                  <s:element minOccurs="1" maxOccurs="1" name="name" type="s:string" />
             </s:sequence>
         </s:complexType>
    </s:schema>
</wsdl:types>

消息定义

用于定义接口的传入消息和传出消息。所有消息的定义都放在一个wsdl:message标签中,name属性用于指定消息的名称,后面定义端口时会用到该属性。wsdl:message标签下可以有若干个wsdl:part标签,每个wsdl:part标签对应一个参数。示例代码如下:

<wsdl:message name="addIn">
    <wsdl:part name="param1" type="s:int"/>
    <wsdl:part name="param2" type="s:int"/>
</wsdl:message>
<wsdl:message name="addOut">
    <wsdl:part name="Body" type="s:int"/>
</wsdl:message>

端口定义

用于定义服务提供的接口。所有接口都在wsdl:portType标签中定义,name属性用于指定端口的名称,后面绑定时需要用到该属性。每个接口用一个wsdl:operation标签定义,name属性指定接口的名称,一般与php中定义的接口名称相同。输入消息和输出消息则通过其子标签wsdl:inputwsdl:output来指定,这两个标签的message属性值需要指定为上面已经定义好的wsdl:message标签的name属性的值。示例代码如下:

<wsdl:portType name="TestPortType">
    <wsdl:operation name="add">
        <wsdl:input message="tns:addIn" />
        <wsdl:output message="tns:addOut" />
    </wsdl:operation>
</wsdl:portType>

绑定

用于绑定接口和协议。所有绑定关系均放在wsdl:binding标签下,name属性用于指定该绑定的名称,后面定义服务时会用到该属性;type属性需要设置为上面定义好的wsdl:portType标签的name属性的值 。如果使用SOAP消息来传输,则wsdl:binding标签下还有一个soap:binding子标签,其transport属性用于指定传输协议,一般为http://schemas.xmlsoap.org/soap/http

每一组绑定关系都是一个wsdl:operation标签,其name属性需要与端口定义中的wsdl:operation标签的name属性相同。该标签下有一个soap:operation标签,属性soapActionstyle用于指定soap动作的地址和调用方式。soapAction的值为wsdl:definitions根标签中targetNamespace属性指定的命名空间加上php中定义的接口名字。style的取值有两种:document(文档)和rpc(远程过程调用)。接口的输入和输出的绑定通过wsdl:inputwsdl:output标签指定,这两个标签都有一个子标签soap:body,其use属性的取值有两种:encoded(编码方式)和literal(文字方式)。关于documentrpcencodedliteral的具体含义,可参考这篇文章:http://blog.163.com/liuyb_94242/blog/static/4216764620132113914610/,这里不再赘述。示例代码如下:

<wsdl:binding name="TestBinding" type="tns:TestPortType">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="add">
        <soap:operation soapAction="http://tempuri.org/Test/add" style="document" />
             <wsdl:input>
                   <soap:body use="literal" />
             </wsdl:input>
             <wsdl:output>
                   <soap:body use="literal" />
             </wsdl:output>
    </wsdl:operation>
</wsdl:binding>

服务

主要用于指定上面定义的绑定的服务地址。在根标签wsdl:service下,可以有多个wsdl:port标签,其binding属性需要指定为上面定义好的wsdl:binding标签的name属性的值。wsdl:port标签下有一个soap:address的子标签,其location属性为提供WebService服务的php文件的地址。示例代码如下:

<wsdl:service name="TestService">
    <wsdl:port name="TestServicePort" binding="tns:TestBinding">
        <soap:address location="http://192.168.1.24:80/WebService/TestService/TestService.php" />
    </wsdl:port>
    <wsdl:port name="TestServicePort12" binding="tns:TestBinding12">
        <soap12:address location="http://192.168.1.24:80/WebService/TestService/TestService.php" />
    </wsdl:port>
</wsdl:service>

关于使用wsdl文件的注意事项,请参考我的这篇文章:【原】使用wsdl的注意事项。

Search

    Table of Contents