PHP soap web service 使用wsdl文件 demo:
==============================================================
服务端:
在使用wsdl的soap webservice demo 前先使用cw.php 文件生成wsdl文件, 代码如下:
cw.php:
<span style="color: #000000;">php </span><span style="color: #0000ff;">include</span>("service.php"<span style="color: #000000;">); </span><span style="color: #0000ff;">include</span>("SoapDiscovery.class.php"<span style="color: #000000;">); </span><span style="color: #800080;">$disco</span> = <span style="color: #0000ff;">new</span> SoapDiscovery('soapHandle', 'myService'); <span style="color: #008000;">//</span><span style="color: #008000;">第一个参数是类名(生成的wsdl文件就是以它来命名的),即Service类,第二个参数是服务的名字(这个可以随便写)。</span> <span style="color: #800080;">$disco</span>->getWSDL();<br><br>?>
service.php:
<span style="color: #000000;">php </span><span style="color: #0000ff;">include_once</span>("soapHandle.class.php"<span style="color: #000000;">); </span><span style="color: #800080;">$server</span> = <span style="color: #0000ff;">new</span> SoapServer('soapHandle.wsdl', <span style="color: #0000ff;">array</span>('soap_version' => SOAP_1_2)); <span style="color: #008000;">#</span><span style="color: #008000;">#此处的Service.wsdl文件是上面生成的</span> <span style="color: #800080;">$server</span>->setClass("soapHandle"); <span style="color: #008000;">//</span><span style="color: #008000;">注册Service类的所有方法 </span> <span style="color: #800080;">$server</span>->handle(); <span style="color: #008000;">//</span><span style="color: #008000;">处理请求</span> ?>
soapHandle.class.php :
<span style="color: #000000;">php </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> soapHandle{ </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> strtolink(<span style="color: #800080;">$url</span>=''<span style="color: #000000;">){ </span><span style="color: #0000ff;">return</span> <span style="color: #008080;">sprintf</span>('<a href="%s">%s</a>', <span style="color: #800080;">$url</span>, <span style="color: #800080;">$url</span><span style="color: #000000;">); } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> add(<span style="color: #800080;">$a</span>=1, <span style="color: #800080;">$b</span>=2<span style="color: #000000;">) { </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$a</span>+<span style="color: #800080;">$b</span><span style="color: #000000;">; } } </span>?>
SoapDiscovery.class.php 代码如下:
===========================================================
<span style="color: #000000;">php </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * Copyright (c) 2005, Braulio Jos?Solano Rojas * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of the Solsoft de Costa Rica S.A. nor the names of its contributors may * be used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * @version $Id$ * @copyright 2005 </span><span style="color: #008000;">*/</span> <span style="color: #008000;">/*</span><span style="color: #008000;">* * SoapDiscovery Class that provides Web Service Definition Language (WSDL). * * @package SoapDiscovery * @author Braulio Jos?Solano Rojas * @copyright Copyright (c) 2005 Braulio Jos?Solano Rojas * @version $Id$ * @access public *</span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> SoapDiscovery { </span><span style="color: #0000ff;">private</span> <span style="color: #800080;">$class_name</span> = ''<span style="color: #000000;">; </span><span style="color: #0000ff;">private</span> <span style="color: #800080;">$service_name</span> = ''<span style="color: #000000;">; </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * SoapDiscovery::__construct() SoapDiscovery class Constructor. * * @param string $class_name * @param string $service_name *</span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> __construct(<span style="color: #800080;">$class_name</span> = '', <span style="color: #800080;">$service_name</span> = ''<span style="color: #000000;">) { </span><span style="color: #800080;">$this</span>->class_name = <span style="color: #800080;">$class_name</span><span style="color: #000000;">; </span><span style="color: #800080;">$this</span>->service_name = <span style="color: #800080;">$service_name</span><span style="color: #000000;">; } </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * SoapDiscovery::getWSDL() Returns the WSDL of a class if the class is instantiable. * * @return string *</span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> getWSDL() { </span><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$this</span>-><span style="color: #000000;">service_name)) { </span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">Exception</span>('No service name.'<span style="color: #000000;">); } </span><span style="color: #800080;">$headerWSDL</span> = "<?xml version=\"1.0\" ?>\n"<span style="color: #000000;">; </span><span style="color: #800080;">$headerWSDL</span>.= "<definitions name='\"<span' style="color: #800080;">$this->service_name\" targetNamespace=\"urn:<span style="color: #800080;">$this</span>->service_name\" xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\" xmlns:soap=\"http://schemas.xmlsoap.org/wsdl/soap/\" xmlns:tns=\"urn:<span style="color: #800080;">$this</span>->service_name\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns=\"http://schemas.xmlsoap.org/wsdl/\">\n"<span style="color: #000000;">; </span><span style="color: #800080;">$headerWSDL</span>.= "<types xmlns='\"http://schemas.xmlsoap.org/wsdl/\"'></types>\n"<span style="color: #000000;">; </span><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$this</span>-><span style="color: #000000;">class_name)) { </span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">Exception</span>('No class name.'<span style="color: #000000;">); } </span><span style="color: #800080;">$class</span> = <span style="color: #0000ff;">new</span> ReflectionClass(<span style="color: #800080;">$this</span>-><span style="color: #000000;">class_name); </span><span style="color: #0000ff;">if</span> (!<span style="color: #800080;">$class</span>-><span style="color: #000000;">isInstantiable()) { </span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">Exception</span>('Class is not instantiable.'<span style="color: #000000;">); } </span><span style="color: #800080;">$methods</span> = <span style="color: #800080;">$class</span>-><span style="color: #000000;">getMethods(); </span><span style="color: #800080;">$portTypeWSDL</span> = '<porttype name="'.<span style=" color:>$this->service_name.'Port">'<span style="color: #000000;">; </span><span style="color: #800080;">$bindingWSDL</span> = '<binding name="'.<span style=" color:>$this->service_name.'Binding" type="tns:'.<span style="color: #800080;">$this</span>->service_name."Port\">\n<binding style='\"rpc\"' transport='\"http://schemas.xmlsoap.org/soap/http\"'></binding>\n"<span style="color: #000000;">; </span><span style="color: #800080;">$serviceWSDL</span> = '<service name="'.<span style=" color:>$this->service_name."\">\n<documentation></documentation>\n<port name='\"".<span' style="color: #800080;">$this->service_name.'Port" binding="tns:'.<span style="color: #800080;">$this</span>->service_name."Binding\"><address location='\"http://".<span' style="color: #800080;">$_SERVER['SERVER_NAME'].':'.<span style="color: #800080;">$_SERVER</span>['SERVER_PORT'].<span style="color: #800080;">$_SERVER</span>['PHP_SELF']."\" />\n</address></port>\n</service>\n"<span style="color: #000000;">; </span><span style="color: #800080;">$messageWSDL</span> = ''<span style="color: #000000;">; </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$methods</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$method</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$method</span>->isPublic() && !<span style="color: #800080;">$method</span>-><span style="color: #000000;">isConstructor()) { </span><span style="color: #800080;">$portTypeWSDL</span>.= '<operation name="'.<span style=" color:>$method->getName()."\">\n".'<input message="tns:'.<span style=" color:>$method->getName()."Request\" />\n<output message='\"tns:".<span' style="color: #800080;">$method->getName()."Response\" />\n</output></operation>\n"<span style="color: #000000;">; </span><span style="color: #800080;">$bindingWSDL</span>.= '<operation name="'.<span style=" color:>$method->getName()."\">\n".'<operation soapaction="urn:'.<span style=" color:>$this->service_name.'#'.<span style="color: #800080;">$this</span>->class_name.'#'.<span style="color: #800080;">$method</span>->getName()."\" />\n<input><body use='\"encoded\"' namespace='\"urn:<span' style="color: #800080;">$this->service_name\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" />\n\n<output>\n<body use='\"encoded\"' namespace='\"urn:<span' style="color: #800080;">$this->service_name\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" />\n</body></output>\n</body></operation></operation>\n"<span style="color: #000000;">; </span><span style="color: #800080;">$messageWSDL</span>.= '<message name="'.<span style=" color:>$method->getName()."Request\">\n"<span style="color: #000000;">; </span><span style="color: #800080;">$parameters</span> = <span style="color: #800080;">$method</span>-><span style="color: #000000;">getParameters(); </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$parameters</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$parameter</span><span style="color: #000000;">) { </span><span style="color: #800080;">$messageWSDL</span>.= '<part name="'.<span style=" color:>$parameter->getName()."\" type=\"xsd:string\" />\n"<span style="color: #000000;">; } </span><span style="color: #800080;">$messageWSDL</span>.= "</part></message>\n"<span style="color: #000000;">; </span><span style="color: #800080;">$messageWSDL</span>.= '<message name="'.<span style=" color:>$method->getName()."Response\">\n"<span style="color: #000000;">; </span><span style="color: #800080;">$messageWSDL</span>.= '<part name="'.<span style=" color:>$method->getName()."\" type=\"xsd:string\" />\n"<span style="color: #000000;">; </span><span style="color: #800080;">$messageWSDL</span>.= "</part></message>\n"<span style="color: #000000;">; } } </span><span style="color: #800080;">$portTypeWSDL</span>.= "</binding></porttype>\n"<span style="color: #000000;">; </span><span style="color: #800080;">$bindingWSDL</span>.= "\n"<span style="color: #000000;">; </span><span style="color: #008000;">//</span><span style="color: #008000;">return sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</span></definitions>'); <span style="color: #800080;">$fso</span> = <span style="color: #008080;">fopen</span>(<span style="color: #800080;">$this</span>->class_name . ".wsdl", "w"<span style="color: #000000;">); </span><span style="color: #008080;">fwrite</span>(<span style="color: #800080;">$fso</span>, <span style="color: #008080;">sprintf</span>('%s%s%s%s%s%s', <span style="color: #800080;">$headerWSDL</span>, <span style="color: #800080;">$portTypeWSDL</span>, <span style="color: #800080;">$bindingWSDL</span>, <span style="color: #800080;">$serviceWSDL</span>, <span style="color: #800080;">$messageWSDL</span>, ''<span style="color: #000000;">)); } </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * SoapDiscovery::getDiscovery() Returns discovery of WSDL. * * @return string *</span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> getDiscovery() { </span><span style="color: #0000ff;">return</span> "<?xml version=\"1.0\" ?>\n<discovery xmlns:disco='\"http://schemas.xmlsoap.org/disco/\"' xmlns:scl='\"http://schemas.xmlsoap.org/disco/scl/\"'>\n<contractref ref='\"http://".<span' style="color: #800080;">$_SERVER['SERVER_NAME'].':'.<span style="color: #800080;">$_SERVER</span>['SERVER_PORT'].<span style="color: #800080;">$_SERVER</span>['PHP_SELF']."?wsdl\" />\n</contractref></discovery>"<span style="color: #000000;">; } } </span>?>
客户端:
client.php 代码:
=============================================================
<span style="color: #000000;">php </span><span style="color: #008080;">ini_set</span>('soap.wsdl_cache_enabled', "0"); <span style="color: #008000;">//</span><span style="color: #008000;">关闭wsdl缓存</span> <span style="color: #800080;">$soap</span> = <span style="color: #0000ff;">new</span> SoapClient('http://localhost/soap/service.php?wsdl'<span style="color: #000000;">); </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$soap</span>->strtolink('http://www.baidu.com')."<br>"<span style="color: #000000;">; </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$soap</span>->add(28, 100)."<br>"<span style="color: #000000;">; </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$soap</span>->__soapCall('add',<span style="color: #0000ff;">array</span>(28,200))."<br>"<span style="color: #000000;">; </span><span style="color: #008000;">//</span><span style="color: #008000;">或这样调用</span> <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$soap</span>->__Call('add',<span style="color: #0000ff;">array</span>(28,300))."<br>"<span style="color: #000000;">; </span><span style="color: #0000ff;">echo</span> <span style="color: #008080;">date</span>('Y-m-d H:i:s', <span style="color: #008080;">time</span><span style="color: #000000;">()); </span>?>
================ END====================