【原】原生态手写wsdl文件 – 胡健 – 博客园

使用php编写WebService时,有两种方式:
    1、不使用wsdl文件。采用这种方式时,只有php脚本能访问WebService。
    2、使用wsdl文件。采用这种方式时,无论哪个平台,采用什么语言,都可以通过wsdl文件来访问WebService。wsdl文件就相当于Client端和Server端之间的通信契约。另外,在wsdl文件中还可以指定消息传输的方式,比如Soap、HTTP GET、HTTP POST等。
    下面主要介绍如何手写一个wsdl文件。


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

复制代码

<span style="font-size: 14px;"><span style="color: #008080;"> 1</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:definitions </p><p></span><span style="color: #008080;"> 2</span>             <span style="color: #ff0000;">xmlns:soap</span><span style="color: #0000ff;">="http://schemas.xmlsoap.org/wsdl/soap/"</span></p><p><span style="color: #008080;"> 3</span> <span style="color: #ff0000;">            xmlns:tm</span><span style="color: #0000ff;">="http://microsoft.com/wsdl/mime/textMatching/"</span></p><p><span style="color: #008080;"> 4</span> <span style="color: #ff0000;">            xmlns:soapenc</span><span style="color: #0000ff;">="http://schemas.xmlsoap.org/soap/encoding/"</span></p><p><span style="color: #008080;"> 5</span> <span style="color: #ff0000;">            xmlns:mime</span><span style="color: #0000ff;">="http://schemas.xmlsoap.org/wsdl/mime/"</span></p><p><span style="color: #008080;"> 6</span> <span style="color: #ff0000;">            xmlns:tns</span><span style="color: #0000ff;">="http://tempuri.org/Test/"</span></p><p><span style="color: #008080;"> 7</span> <span style="color: #ff0000;">            xmlns:s</span><span style="color: #0000ff;">="http://www.w3.org/2001/XMLSchema"</span></p><p><span style="color: #008080;"> 8</span> <span style="color: #ff0000;">            xmlns:soap12</span><span style="color: #0000ff;">="http://schemas.xmlsoap.org/wsdl/soap12/"</span></p><p><span style="color: #008080;"> 9</span> <span style="color: #ff0000;">            xmlns:http</span><span style="color: #0000ff;">="http://schemas.xmlsoap.org/wsdl/http/"</span></p><p><span style="color: #008080;">10</span> <span style="color: #ff0000;">            targetNamespace</span><span style="color: #0000ff;">="http://tempuri.org/Test/"</span></p><p><span style="color: #008080;">11</span> <span style="color: #ff0000;">            xmlns:wsdl</span><span style="color: #0000ff;">="http://schemas.xmlsoap.org/wsdl/"</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;">12</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">wsdl:definitions</span><span style="color: #0000ff;">&gt;</span></span>

复制代码

    其中,targetNamespace=”http://tempuri.org/Test/”和xmlns:tns=”http://tempuri.org/Test/”共同指定了本文件中的自定义标签和属性的命名空间。 这两个属性的值必须完全相同,字符串”Test”可以修改,不同的WebService有不同的值。xmlns:tns中的tns也可以修改成其他的值,修改后下面使用的地方必须与其保持一致。
    根标签下面主要包括五个部分的内容,分别是:类型定义、消息定义、端口定义、绑定和服务。下面分别进行介绍:
    1、类型定义。这部分内容包含在一个wsdl:types标签中,主要定义消息中需要用到的数据类型, 采用W3C XML模式内置类型作为其基本类型系统 。关于数据类型的介绍,可以参考这篇文章:http://www.cnblogs.com/newsouls/archive/2011/10/28/2227765.html。    

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

复制代码

<span style="font-size: 14px;"><span style="color: #008080;"> 1</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:types</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;"> 2</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">s:schema </span><span style="color: #ff0000;">elementFormDefault</span><span style="color: #0000ff;">="qualified"</span> <span style="color: #ff0000;">targetNamespace</span><span style="color: #0000ff;">="http://tempuri.org/Test/"</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;"> 3</span>         <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">s:complexType </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="DepartmentInfo"</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;"> 4</span>             <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">s:sequence</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;"> 5</span>                   <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">s:element </span><span style="color: #ff0000;">minOccurs</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;"> maxOccurs</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="index"</span><span style="color: #ff0000;"> type</span><span style="color: #0000ff;">="s:int"</span> <span style="color: #0000ff;">/&gt;</span></p><p><span style="color: #008080;"> 6</span>                   <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">s:element </span><span style="color: #ff0000;">minOccurs</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;"> maxOccurs</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;"> type</span><span style="color: #0000ff;">="s:string"</span> <span style="color: #0000ff;">/&gt;</span></p><p><span style="color: #008080;"> 7</span>                   <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">s:element </span><span style="color: #ff0000;">minOccurs</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;"> maxOccurs</span><span style="color: #0000ff;">="1"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="name"</span><span style="color: #ff0000;"> type</span><span style="color: #0000ff;">="s:string"</span> <span style="color: #0000ff;">/&gt;</span></p><p><span style="color: #008080;"> 8</span>              <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">s:sequence</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;"> 9</span>          <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">s:complexType</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;">10</span>     <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">s:schema</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;">11</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">wsdl:types</span><span style="color: #0000ff;">&gt;</span></span>

复制代码

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

复制代码

<span style="font-size: 14px;"><span style="color: #008080;">1</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:message </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="addIn"</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;">2</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:part </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="param1"</span><span style="color: #ff0000;"> type</span><span style="color: #0000ff;">="s:int"</span><span style="color: #0000ff;">/&gt;</span></p><p><span style="color: #008080;">3</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:part </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="param2"</span><span style="color: #ff0000;"> type</span><span style="color: #0000ff;">="s:int"</span><span style="color: #0000ff;">/&gt;</span></p><p><span style="color: #008080;">4</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">wsdl:message</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;">5</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:message </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="addOut"</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;">6</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:part </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="Body"</span><span style="color: #ff0000;"> type</span><span style="color: #0000ff;">="s:int"</span><span style="color: #0000ff;">/&gt;</span></p><p><span style="color: #008080;">7</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">wsdl:message</span><span style="color: #0000ff;">&gt;</span></span>

复制代码

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

<span style="font-size: 14px;"><span style="color: #008080;">1</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:portType </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="TestPortType"</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;">2</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:operation </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="add"</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;">3</span>         <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:input </span><span style="color: #ff0000;">message</span><span style="color: #0000ff;">="tns:addIn"</span> <span style="color: #0000ff;">/&gt;</span></p><p><span style="color: #008080;">4</span>         <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:output </span><span style="color: #ff0000;">message</span><span style="color: #0000ff;">="tns:addOut"</span> <span style="color: #0000ff;">/&gt;</span></p><p><span style="color: #008080;">5</span>     <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">wsdl:operation</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;">6</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">wsdl:portType</span><span style="color: #0000ff;">&gt;</span></span>

    4、绑定。用于绑定接口和协议。所有绑定关系均放在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标签,属性soapAction和style用于指定soap动作的地址和调用方式。soapAction的值为wsdl:definitions根标签中targetNamespace属性指定的命名空间加上php中定义的接口名字。style的取值有两种:document(文档)和rpc(远程过程调用)。接口的输入和输出的绑定通过wsdl:input和wsdl:output标签指定,这两个标签都有一个子标签soap:body,其use属性的取值有两种:encoded(编码方式)和literal(文字方式)。关于document、rpc、encoded和literal的具体含义,可参考这篇文章:http://blog.163.com/liuyb_94242/blog/static/4216764620132113914610/,这里不再赘述。示例代码如下:

复制代码

<span style="font-size: 14px;"><span style="color: #008080;"> 1</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:binding </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="TestBinding"</span><span style="color: #ff0000;"> type</span><span style="color: #0000ff;">="tns:TestPortType"</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;"> 2</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">soap:binding </span><span style="color: #ff0000;">transport</span><span style="color: #0000ff;">="http://schemas.xmlsoap.org/soap/http"</span> <span style="color: #0000ff;">/&gt;</span></p><p><span style="color: #008080;"> 3</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:operation </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="add"</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;"> 4</span>         <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">soap:operation </span><span style="color: #ff0000;">soapAction</span><span style="color: #0000ff;">="http://tempuri.org/Test/add"</span> <span style="color: #ff0000;">style</span><span style="color: #0000ff;">="document"</span> <span style="color: #0000ff;">/&gt;</span></p><p><span style="color: #008080;"> 5</span>              <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:input</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;"> 6</span>                    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">soap:body </span><span style="color: #ff0000;">use</span><span style="color: #0000ff;">="literal"</span> <span style="color: #0000ff;">/&gt;</span></p><p><span style="color: #008080;"> 7</span>              <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">wsdl:input</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;"> 8</span>              <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:output</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;"> 9</span>                    <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">soap:body </span><span style="color: #ff0000;">use</span><span style="color: #0000ff;">="literal"</span> <span style="color: #0000ff;">/&gt;</span></p><p><span style="color: #008080;">10</span>              <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">wsdl:output</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;">11</span>     <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">wsdl:operation</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;">12</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">wsdl:binding</span><span style="color: #0000ff;">&gt;</span></span>

复制代码

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

复制代码

<span style="font-size: 14px;"><span style="color: #008080;">1</span> <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:service </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="TestService"</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;">2</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:port </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="TestServicePort"</span><span style="color: #ff0000;"> binding</span><span style="color: #0000ff;">="tns:TestBinding"</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;">3</span>         <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">soap:address </span><span style="color: #ff0000;">location</span><span style="color: #0000ff;">="http://192.168.1.24:80/WebService/TestService/TestService.php"</span> <span style="color: #0000ff;">/&gt;</span></p><p><span style="color: #008080;">4</span>     <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">wsdl:port</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;">5</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">wsdl:port </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="TestServicePort12"</span><span style="color: #ff0000;"> binding</span><span style="color: #0000ff;">="tns:TestBinding12"</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;">6</span>         <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">soap12:address </span><span style="color: #ff0000;">location</span><span style="color: #0000ff;">="http://192.168.1.24:80/WebService/TestService/TestService.php"</span> <span style="color: #0000ff;">/&gt;</span></p><p><span style="color: #008080;">7</span>     <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">wsdl:port</span><span style="color: #0000ff;">&gt;</span></p><p><span style="color: #008080;">8</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">wsdl:service</span><span style="color: #0000ff;">&gt;</span></span>

复制代码

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

来源URL:http://www.cnblogs.com/hujian/p/3497127.html