php wsdl生成类,无需任何组件
这个类是国外一个网站找来的,无需任何组件,即可实现wsdl接口处理还不错的,之前弄的一个小说网站http://www.fuheishu.com/ 与.net简单实现对话. 下面的代码一共三个,处理类、服务端、客
这个类是国外一个网站找来的,无需任何组件,即可实现wsdl接口处理
还不错的,之前弄的一个小说网站http://www.fuheishu.com/ 与.net简单实现对话.
下面的代码一共三个,处理类、服务端、客户端;调用自己的wsdl文件即可;
还不错的,之前弄的一个小说网站http://www.fuheishu.com/ 与.net简单实现对话.
下面的代码一共三个,处理类、服务端、客户端;调用自己的wsdl文件即可;
<?php
/*
* wsdl处理类
*/
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>";
}
}
?>
2. [代码]wsdl服务端接收 跳至 [1] [2] [3] [全屏预览]
<?php
/**
+------------------------------------------------------------------------------
* wsdl服务端
+------------------------------------------------------------------------------
* @wsdl服务端接收
+------------------------------------------------------------------------------
*/
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('Mywsdl','www.fuheishu.com');
$str = $disco->getWSDL();
file_put_contents(WSDL_URL,$str);
}
//SOAP开启并接收Client传入的参数响应
$server = new SoapServer(WSDL_URL);
$server->setClass('Mywsdl');
$server->handle();
//测试定义公开的类
class Mywsdl {
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();
}
public function myfunc($a=''){
return $a;
}
}
?>
3. [代码]wsdl客户端 跳至 [1] [2] [3] [全屏预览]
<?php
/**
+------------------------------------------------------------------------------
* wsdl客户端
+------------------------------------------------------------------------------
* @wsdl客户端发送
+------------------------------------------------------------------------------
*/
$client = new SoapClient("http://127.0.0.1/createsoap/hello.wsdl");
try {
$result = $client->myfunc('789');
var_dump($result);
//echo "The answer isresult";
}
catch (SoapFault $f){
echo "Error Message: {$f->getMessage()}";
}
?>
- 上一篇:下载文件--针对大多数的文件类型
- 下一篇:php websocket在线聊天
精彩图集
精彩文章






