使用PHP搭建WebService伺服器
阿新 • • 發佈:2019-02-11
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方法,並傳入陣列作為引數
?>
執行結果: