推荐一个php服务端wsdl文件生成类(SoapDiscovery)

本blog文章如没特殊声明均为原创文章,转载请注明出处,谢谢!

zde的生成器一点就死机退出,崩溃,在网上找的一个wsdl文件生成器,挺好用的,和童鞋们分享下。
注(作者原话):

Just copy the three PHP files to your server in the same directory.

Create a client that connects to HelloWorldService.php .

Be sure that you are running PHP 5 and that the SOAP extension is loaded.

Good luck!

类代码(SoapDiscovery.class.php):

<?php
/**
 * 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>";
    
}
}
 
?>

使用方法(服务端server.php):

<?php
define('WSDL_URL','hello.wsdl');        //定义WSDL文件路径
ini_set('soap.wsdl_cache_enabled','0');    //关闭WSDL缓存
 
//WSDL文件不存在时自动创建
if(!file_exists(WSDL_URL))
{
    
require_once 'SoapDiscovery.class.php';
    
$disco = new SoapDiscovery('HelloWorld','IELIWB_HelloWorld');
    
$str = $disco->getWSDL();
    
file_put_contents(WSDL_URL,$str);
}
 
//SOAP开启并接收Client传入的参数响应
$server = new SoapServer(WSDL_URL);
$server->setClass('HelloWorld');
$server->handle();
 
 
//测试定义公开的类
class HelloWorld {
    
private $nombre = '';
    
public function __construct($name = 'World') {$this->name = $name;}
    
public function greet($name = '') {$name = $name?$name:$this->name;return 'Hello '.$name.'.';}
    
public function serverTimestamp() {return time();}
}
 
?>

客户端client.php:

<?php
/**
 +------------------------------------------------------------------------------
 * HXPHP 
 +------------------------------------------------------------------------------
 *
@HXPHP Framwork
 *
@Author ieliwb<ieliwb@gmail.com>
 *
@Copyright (c) www.ieliwb.com
 +------------------------------------------------------------------------------
 */

 
//$client = new SoapClient(null,array('location'=>'http://localhost/createsoap/HelloWorld.class.php','uri'=>'http://localhost/createsoap/HelloWorld.class.php'));
 
$client = new SoapClient("http://127.0.0.1/createsoap/hello.wsdl");
 
try {
        
$result = $client->greet('ieliwb');
        
var_dump($result);
        
echo "The answer isresult";
}
catch (SoapFault $f){
        
echo "Error Message: {$f->getMessage()}";
}
?>

完整演示包下载,请童鞋们注意路径。

评论

小赵 Says:

我要传对象到服务器端怎么办?

花太香齐 Says:

序列化发送即可

发表新评论