PHP Webservice简单实例

来源:互联网 发布:淘宝充值未到账怎么办 编辑:程序博客网 时间:2024/05/17 03:04

这是对上一篇《PHP Webservice知识点笔记》的一个简单实例补充。

  • 测试网站目录:http://test.com/testWebservice/
  1. server端代码serverHasWsdl.php(WSDL模式)
    <?phpdefine('WSDL_URL','test.wsdl');             //定义WSDL文件路径ini_set('soap.wsdl_cache_enabled', '0');    //关闭WSDL缓存 //WSDL文件不存在时自动创建if(!file_exists(WSDL_URL)){    require_once 'SoapDiscovery.class.php';    $disco = new SoapDiscovery('MyTest', 'test.com'); //SoapDiscovery是网上一个生成wsdl的类    $str = $disco->getWSDL();    file_put_contents(WSDL_URL, $str);}$server = new SoapServer(WSDL_URL); $server->setClass('MyTest');$server->handle();  //测试类class MyTest {        public function addition ($a=0, $b=0){        return $a + $b;    }    }?>

  2. client端代码clientHasWsdl.php(WSDL模式)
    <?php$client = new SoapClient("http://test.com/testWebservice/test.wsdl");try {    $result = $client->addition(100,200);    //$result = $client->__soapCall('addition',array(600,200));    var_dump($result);}catch (SoapFault $f) {    echo "Error Message: {$f->getMessage()}";}?>

  3. server端代码serverNonWsdl.php(non-WSDL模式)
    <?php$server = new SoapServer(null, array('uri'=>'testWebservice','soap_version'=>SOAP_1_2));$server->setClass('MyTest');$server->handle();//测试类class MyTest {        public function addition ($a=0, $b=0){        return $a + $b;    }    }?>
  4. client端代码clientNonWsdl.php(non-WSDL模式)
    <?php$client = new SoapClient(null, array('location'=>'http://test.com/testWebservice/serverNonWsdl.php','uri'=>'testWebservice'));try {    $result = $client->addition(200,300);    //$result = $client->__soapCall('addition',array(300,300));    var_dump($result);}catch (SoapFault $f) {    echo "Error Message: {$f->getMessage()}";}?>
  5. 通过CURL访问clientCurl.php
    <?php$requestxml = '<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:test.com">   <soapenv:Header/>   <soapenv:Body>      <urn:addition soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">         <a xsi:type="xsd:string">300</a>         <b xsi:type="xsd:string">500</b>      </urn:addition>   </soapenv:Body></soapenv:Envelope>';$ch = curl_init();curl_setopt($ch, CURLOPT_URL, 'http://test.com/testWebservice/serverHasWsdl.php');//curl_setopt($ch, CURLOPT_URL, 'http://test.com/testWebservice/serverNonWsdl.php');curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $requestxml);curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/soap+xml; charset=utf-8", "Content-length: ".strlen($requestxml))); $response = curl_exec($ch);curl_close($ch);echo $response;?>
  6. SoapDiscovery.class.php
    <?php  /** * 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  *//** * 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 **/class SoapDiscovery {private $class_name = '';private $service_name = '';/** * SoapDiscovery::__construct() SoapDiscovery class Constructor. *  * @param string $class_name * @param string $service_name **/public function __construct($class_name = '', $service_name = '') {$this->class_name = $class_name;$this->service_name = $service_name;}/** * SoapDiscovery::getWSDL() Returns the WSDL of a class if the class is instantiable. *  * @return string **/public function getWSDL() {if (empty($this->service_name)) {throw new Exception('No service name.');}$headerWSDL = "<?xml version=\"1.0\" ?>\n";$headerWSDL.= "<definitions name=\"$this->service_name\" targetNamespace=\"urn:$this->service_name\" xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\" xmlns:soap=\"http://schemas.xmlsoap.org/wsdl/soap/\" xmlns:tns=\"urn:$this->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";$headerWSDL.= "<types xmlns=\"http://schemas.xmlsoap.org/wsdl/\" />\n";if (empty($this->class_name)) {throw new Exception('No class name.');}$class = new ReflectionClass($this->class_name);if (!$class->isInstantiable()) {throw new Exception('Class is not instantiable.');}$methods = $class->getMethods();$portTypeWSDL = '<portType name="'.$this->service_name.'Port">';$bindingWSDL = '<binding name="'.$this->service_name.'Binding" type="tns:'.$this->service_name."Port\">\n<soap:binding style=\"rpc\" transport=\"http://schemas.xmlsoap.org/soap/http\" />\n";$serviceWSDL = '<service name="'.$this->service_name."\">\n<documentation />\n<port name=\"".$this->service_name.'Port" binding="tns:'.$this->service_name."Binding\"><soap:address location=\"http://".$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['PHP_SELF']."\" />\n</port>\n</service>\n";$messageWSDL = '';foreach ($methods as $method) {if ($method->isPublic() && !$method->isConstructor()) {$portTypeWSDL.= '<operation name="'.$method->getName()."\">\n".'<input message="tns:'.$method->getName()."Request\" />\n<output message=\"tns:".$method->getName()."Response\" />\n</operation>\n";$bindingWSDL.= '<operation name="'.$method->getName()."\">\n".'<soap:operation soapAction="urn:'.$this->service_name.'#'.$this->class_name.'#'.$method->getName()."\" />\n<input><soap:body use=\"encoded\" namespace=\"urn:$this->service_name\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" />\n</input>\n<output>\n<soap:body use=\"encoded\" namespace=\"urn:$this->service_name\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" />\n</output>\n</operation>\n";    $messageWSDL.= '<message name="'.$method->getName()."Request\">\n";$parameters = $method->getParameters();foreach ($parameters as $parameter) {$messageWSDL.= '<part name="'.$parameter->getName()."\" type=\"xsd:string\" />\n";}$messageWSDL.= "</message>\n";$messageWSDL.= '<message name="'.$method->getName()."Response\">\n";$messageWSDL.= '<part name="'.$method->getName()."\" type=\"xsd:string\" />\n";$messageWSDL.= "</message>\n";}}$portTypeWSDL.= "</portType>\n";$bindingWSDL.= "</binding>\n";return sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>');}/** * SoapDiscovery::getDiscovery() Returns discovery of WSDL. *  * @return string **/public function getDiscovery() {return "<?xml version=\"1.0\" ?>\n<disco:discovery xmlns:disco=\"http://schemas.xmlsoap.org/disco/\" xmlns:scl=\"http://schemas.xmlsoap.org/disco/scl/\">\n<scl:contractRef ref=\"http://".$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['PHP_SELF']."?wsdl\" />\n</disco:discovery>";}}?>




0 0