zoukankan      html  css  js  c++  java
  • soap的简单实现(PHP)

    1.非wsdl模式

    (1)函数文件

    testphp/ServiceFunctions.class.php

    <?php
    
    /** 
     * @author 左小兵
     * 
     */
    class ServiceFunctions  {
    
        public    function getDisplayName($f,$l) {
            $name='';
            $name.=$f;
            $name.=$l;
            return $name;
        }
        public function countWords($c){
            return count($c);
        }
    }
    
    ?>
    View Code

    (2)服务端文件

    testphp/soapserver.php

    <?php
    require_once 'ServiceFunctions.class.php';
    $options=array('uri'=>'http://localhost');
    $server=new SoapServer(null,$options);
    $server->setClass("ServiceFunctions");
    $server->handle();
    ?>
    View Code

    (3)客户端文件

    testphp/SoapClient.php

    <?php
        $options=array(
        'uri'=>'http://localhost',
        'location'=>'http://localhost/testphp/soapserver.php',
        'trace'=>1
        );
        $client=new SoapClient(null,$options);
        echo $client->getDisplayName('joec','bloggs');
    ?>
    View Code

    2.wsdl模式

    函数文件和服务端文件一样

    (1)新加入一个生成wsdl文件的php类,并且要先访问这个类,以生成wsdl文件.

    testphp/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: SoapDiscovery.class.php 66 2013-04-10 07:12:21Z ideaa $
    * @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: SoapDiscovery.class.php 66 2013-04-10 07:12:21Z ideaa $
    * @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" ?>
    ";
    $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/">
    ";
    $headerWSDL.= "<types xmlns="http://schemas.xmlsoap.org/wsdl/" />
    ";
    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">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
    ";
    $serviceWSDL = '<service name="' . $this->service_name . "">
    <documentation />
    <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'] . "" />
    </port>
    </service>
    ";
    $messageWSDL = '';
    foreach ($methods as $method) {
    if ($method->isPublic() && !$method->isConstructor()) {
    $portTypeWSDL.= '<operation name="' . $method->getName() . "">
    " . '<input message="tns:' . $method->getName() . "Request" />
    <output message="tns:" . $method->getName() . "Response" />
    </operation>
    ";
    $bindingWSDL.= '<operation name="' . $method->getName() . "">
    " . '<soap:operation soapAction="urn:' . $this->service_name . '#' . $this->class_name . '#' . $method->getName() . "" />
    <input><soap:body use="encoded" namespace="urn:$this->service_name" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
    </input>
    <output>
    <soap:body use="encoded" namespace="urn:$this->service_name" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
    </output>
    </operation>
    ";
    $messageWSDL.= '<message name="' . $method->getName() . "Request">
    ";
    $parameters = $method->getParameters();
    foreach ($parameters as $parameter) {
    $messageWSDL.= '<part name="' . $parameter->getName() . "" type="xsd:string" />
    ";
    }
    $messageWSDL.= "</message>
    ";
    $messageWSDL.= '<message name="' . $method->getName() . "Response">
    ";
    $messageWSDL.= '<part name="' . $method->getName() . "" type="xsd:string" />
    ";
    $messageWSDL.= "</message>
    ";
    }
    }
    $portTypeWSDL.= "</portType>
    ";
    $bindingWSDL.= "</binding>
    ";
    //return sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>');
    //生成wsdl文件,将上面的return注释
    $fso = fopen($this->class_name . ".wsdl", "w");
    fwrite($fso, 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" ?>
    <disco:discovery xmlns:disco="http://schemas.xmlsoap.org/disco/" xmlns:scl="http://schemas.xmlsoap.org/disco/scl/">
    <scl:contractRef ref="http://" . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . $_SERVER['PHP_SELF'] . "?wsdl" />
    </disco:discovery>";
    }
    }
    require_once 'ServiceFunctions.class.php';
    $wsdl=new SoapDiscovery('ServiceFunctions','soap');
    $wsdl->getWSDL();
    ?> 
    View Code

    (2)客户端文件

    testphp/SoapClient.php

    <?php
       ini_set('soap.wsdl_cache_enabled',0);
       $options=array(
        'uri'=>'http://localhost',
        'location'=>'http://localhost/testphp/soapserver.php',
        'trace'=>1
        );
       $client=new SoapClient('http://localhost/testphp/ServiceFunctions.wsdl', $options);
       $functions=$client->__getFunctions();
       var_dump($functions);
      $name= $client->getDisplayName('x','ss');
      var_dump($name);
    ?>
    View Code
  • 相关阅读:
    [codevs]失恋28天题目系列
    [NOIP1998]最大数
    [codevs4247]奇特的生物
    [codevs1380]没有上司的舞会
    [codevs2152]滑雪
    [codevs2171]棋盘覆盖
    [codevs2170]悠闲的漫步
    [codevs1557]热浪
    [codevs1554]最佳课题选择
    nodejs建站+github page 建站问题总结
  • 原文地址:https://www.cnblogs.com/zuoxiaobing/p/3667529.html
Copyright © 2011-2022 走看看