1. 程式人生 > >使用PHP搭建WebService伺服器

使用PHP搭建WebService伺服器

1、WSDL概念

網路服務描述語言是Web Service的描述語言,它包含一系列描述某個web service的定義。

定義模板:

<?xml version ='1.0' encoding ='UTF-8' ?>
<definitions name='自定義名稱[可選]'
targetNamespace='名稱空間[一般為URL]'
xmlns:tns='名稱空間[值同targetNamespace]'
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/' xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' xmlns='http://schemas.xmlsoap.org/wsdl/'>
<!--<types> 元素定義 web service 使用的資料型別,WSDL 使用 XML Schema 語法來定義資料型別,也可以自定義Schema不包含的型別--> <types> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="[值同上tns]">
</xsd:schema> </types> <!-- <message> 元素可定義每個訊息的部件,以及相關聯的資料型別. --> <message name='操作名Request'> <part name="term" type="xsd:string"/> </message> <message name='操作名Response'> <part name="value" type="xsd:string"/> </message
>
<!-- <portType> 元素是最重要的 WSDL 元素.它可描述一個 web service、 可被執行的操作,以及相關的訊息. 它告訴你去哪個WebService的連線點,扮演了一個控制者. --> <portType name='操作列表名'> <operation name='操作名'> <input message='tns:操作名Request'/> <output message='tns:操作名Response'/> </operation> </portType> <!--<binding> 元素為每個埠定義訊息格式和協議細節--> <binding name='WS下的頻道名稱' type='tns:頻道下的操作列表'> <!--style:屬性可取值 "rpc" 或 "document",ransport:屬性定義了要使用的 SOAP 協議.在這個例子中我們使用 HTTP--> <soap:binding style='rpc' transport='http://schemas.xmlsoap.org/soap/http'/> <!--operation 元素定義了每個埠提供的操作符,對於每個操作,相應的 SOAP 行為都需要被定義--> <operation name='test'> <soap:operation soapAction='http://www.cwtservice.cn/newOperation/'/> <input> <soap:body use='encoded' namespace='urn:xmethods-delayed-quotes' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/> </input> <output> <soap:body use='encoded' namespace='urn:xmethods-delayed-quotes' encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/> </output> </operation> </binding> <!--<service>包含一個或者多個port元素,每個port元素表示一個不同的Web服務--> <service name='WebService名稱[如weatherWS,shopWS]'> <port name='WS下的頻道名稱[如cartSoap,購物車服務]' binding='tns:[頻道名,同左]'> <soap:address location='http://[webservice地址]'/> </port> </service> </definitions>

2、WSDL例項:

<?xml version ='1.0' encoding ='UTF-8' ?>
<definitions
targetNamespace='http://localhost/00/'
xmlns:tns='http://localhost/00/'
xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
xmlns:xsd='http://www.w3.org/2001/XMLSchema'
xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'
xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'
xmlns='http://schemas.xmlsoap.org/wsdl/'>
<!--<types> 元素定義 web service 使用的資料型別,WSDL 使用 XML Schema 語法來定義資料型別,也可以自定義Schema不包含的型別-->
<types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://localhost/00/">
</xsd:schema>
</types>
<!--
<message> 元素可定義每個訊息的部件,以及相關聯的資料型別.
-->
<message name='testRequest'>
<part name="term" type="xsd:ArrayOfstring"/>
</message>
<message name='testResponse'>
<part name="value" type="xsd:ArrayOfstring"/>
</message>
<!--
<portType> 元素是最重要的 WSDL 元素.它可描述一個 web service、 可被執行的操作,以及相關的訊息.
它告訴你去哪個WebService的連線點,扮演了一個控制者.
-->
<portType name='oplist'>
<operation name='test'>
<input message='tns:testRequest'/>
<output message='tns:testResponse'/>
</operation>
</portType>
<!--<binding> 元素為每個埠定義訊息格式和協議細節-->
<binding name='cartSoap' type='tns:oplist'>
<!--style:屬性可取值 "rpc" 或 "document",ransport:屬性定義了要使用的 SOAP 協議.在這個例子中我們使用 HTTP-->
<soap:binding style='rpc'
transport='http://schemas.xmlsoap.org/soap/http'/>
<!--operation 元素定義了每個埠提供的操作符,對於每個操作,相應的 SOAP 行為都需要被定義-->
<operation name='test'>
<soap:operation soapAction='http://www.cwtservice.cn/newOperation/'/>
<input>
<soap:body use='encoded' namespace='urn:xmethods-delayed-quotes'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</input>
<output>
<soap:body use='encoded' namespace='urn:xmethods-delayed-quotes'
encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
</output>
</operation>
</binding>
<!--<service>包含一個或者多個port元素,每個port元素表示一個不同的Web服務-->
<service name='shopWS'>
<port name='cartSoap' binding='tns:cartSoap'>
<soap:address location='http://localhost/booledu/webservice/service.php'/>
</port>
</service>
</definitions>

3、搭建Server端

使用php中的soapServer類來搭建WebService伺服器

<?php
//定義該伺服器可以使用的方法
function test($arr){
    return array_reverse($arr);
}
$soap = new soapServer('./wsdl.xml');
$soap->addFunction('test');//註冊test方法
$soap->handle();//釋出一下
?>

4、搭建Client測試Server端

使用php中的soapClient類來搭建客戶端

<?php
header('Content-type:text/html;charset=utf-8');
$soap = new soapClient('./wsdl.xml');
print_r($soap->test(array('a','b','c')));//測試伺服器端搭建的test方法,並傳入陣列作為引數
?>

執行結果:

這裡寫圖片描述