PHP Webservice简单实例

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

  • 测试网站目录:http://test.com/testWebservice/
  1. server端代码serverHasWsdl.php(WSDL模式)
    <?php
    
    define('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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP WebService是一种使用SOAP协议进行通信的服务器端技术,通过暴露服务接口和方法,允许客户端通过SOAP消息进行请求和响应。 在PHP中,可以使用SoapClient类来创建和调用WebService。可以通过指定WebService路径并初始化一个WebService客户端对象来调用服务提供的方法。 例如,可以使用SoapClient类的__getFunctions()方法获取服务器上提供的开放函数,__getTypes()方法获取服务器上的数据类型,并使用getWeather()方法查询天气信息。 此外,在PHP中也可以直接在web端访问当前的客户端文件来调用第三方的WebService接口。可以使用SoapClient类实例化一个对象,然后调用接口的方法,传递相应的参数,获取结果。 对于创建wsdl文件,可以使用脚本来生成。在Thinkphp5框架中,可以在public目录下创建相应的文件,然后根据需要编写相应的代码来生成wsdl文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [在php的开发环境中如何调取WebService?](https://blog.csdn.net/yj222333/article/details/124821132)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值