CWebService

优质
小牛编辑
141浏览
2023-12-01
所有包 | 属性 | 方法
system.web.services
继承class CWebService » CComponent
源自1.0
版本$Id: CWebService.php 3515 2011-12-28 12:29:24Z mdomba $
源码framework/web/services/CWebService.php
CWebService封装了SOAP服务和提供基于WSDL的WebService。

本类需要PHP的SOAP扩展方可正常运行。

CWebService利用CWsdlGenerator便可自动联机生成WSDL, 免去自己写WSDL的复杂麻烦。

生成WSDL是基于服务提供类中的注释块, 调用generateWsdl或者renderWsdl。处理web service 请求,调用run。

公共属性

隐藏继承属性

属性类型描述定义在
actorstring指定SOAP service的actor。默认为null,即不指定。CWebService
cacheIDstring用于在缓存组件中缓存已经生成的WSDL的ID。 默认值为’cache‘,提交到主缓存组件。 如果不使用缓存,请设置为False。CWebService
classMaparray在WSDL中被声明为复杂类型的类的列表。 这应该是一个以WSDL中声明的类型为Key,对应的PHP类名为值的数组。 类名可以使用别名来表示。CWebService
encodingstringWeb service的编码类型。默认为‘UTF-8’。CWebService
methodNamestring当前请求的方法名称。值为空则表示没有方法被请求。CWebService
persistenceintegerSOAP server的持久模式。CWebService
providerstring|object提供web service的类或者对象。 当值为名称时,此处可以使用别名来表示。CWebService
serviceUrlstringWeb service的URL。在调用generateWsdl()和renderWsdl()时必须提供此属性。CWebService
soapVersionstring指定SOAP版本(例如:‘1.CWebService
wsdlCacheDurationinteger生成的WSDL在缓存中保存的秒数,默认为0,即不缓存。CWebService
wsdlUrlstringWSDL的URL。在调用run()时必须提供此属性。CWebService

受保护属性

隐藏继承属性

属性类型描述定义在
optionsarray创建SoapServer实例的相关配置项。CWebService

公共方法

隐藏继承方法

方法描述定义在
__call()如果类中没有调的方法名,则调用这个方法。CComponent
__construct()构造方法。CWebService
__get()返回一个属性值、一个事件处理程序列表或一个行为名称。CComponent
__isset()检查一个属性是否为null。CComponent
__set()设置一个组件的属性值。CComponent
__unset()设置一个组件的属性为null。CComponent
asa()返回这个名字的行为对象。CComponent
attachBehavior()附加一个行为到组件。CComponent
attachBehaviors()附加一个行为列表到组件。CComponent
attachEventHandler()为事件附加一个事件处理程序。CComponent
canGetProperty()确定属性是否可读。CComponent
canSetProperty()确定属性是否可写。CComponent
detachBehavior()从组件中分离一个行为。CComponent
detachBehaviors()从组件中分离所有行为。CComponent
detachEventHandler()分离一个存在的事件处理程序。CComponent
disableBehavior()禁用一个附加行为。CComponent
disableBehaviors()禁用组件附加的所有行为。CComponent
enableBehavior()启用一个附加行为。CComponent
enableBehaviors()启用组件附加的所有行为。CComponent
evaluateExpression()计算一个PHP表达式,或根据组件上下文执行回调。CComponent
generateWsdl()根据提供web service的类或者对象的定义生成WSDL。CWebService
getEventHandlers()返回一个事件的附加处理程序列表。CComponent
getMethodName()返回当前请求的方法名称。值为空则表示没有方法被请求。CWebService
handleError()PHP错误处理器。CWebService
hasEvent()确定一个事件是否定义。CComponent
hasEventHandler()检查事件是否有附加的处理程序。CComponent
hasProperty()确定属性是否被定义。CComponent
raiseEvent()发起一个事件。CComponent
renderWsdl()根据提供web service的类或者对象的定义生成和显示WSDL。CWebService
run()处理web service请求。CWebService

受保护方法

隐藏继承方法

方法描述定义在
getOptions()返回创建SoapServer实例的相关配置项。CWebService

属性详细

actor 属性 public string $actor;

指定SOAP service的actor。默认为null,即不指定。

cacheID 属性 public string $cacheID;

用于在缓存组件中缓存已经生成的WSDL的ID。 默认值为’cache‘,提交到主缓存组件。 如果不使用缓存,请设置为False。

classMap 属性 public array $classMap;

在WSDL中被声明为复杂类型的类的列表。 这应该是一个以WSDL中声明的类型为Key,对应的PHP类名为值的数组。 类名可以使用别名来表示。

参见

  • http://www.php.net/manual/en/function.soap-soapserver-construct.php
encoding 属性 public string $encoding;

Web service的编码类型。默认为‘UTF-8’。

methodName 属性 只读 public string getMethodName()

当前请求的方法名称。值为空则表示没有方法被请求。

options 属性 只读 protected array getOptions()

创建SoapServer实例的相关配置项。

参见

  • http://www.php.net/manual/en/function.soap-soapserver-construct.php
persistence 属性 public integer $persistence;

SOAP server的持久模式。

参见

  • http://www.php.net/manual/en/function.soap-soapserver-setpersistence.php
provider 属性 public string|object $provider;

提供web service的类或者对象。 当值为名称时,此处可以使用别名来表示。

serviceUrl 属性 public string $serviceUrl;

Web service的URL。在调用generateWsdl()和renderWsdl()时必须提供此属性。

soapVersion 属性 public string $soapVersion;

指定SOAP版本(例如:‘1.1’或‘1.2’)。默认为null,即不指定。

wsdlCacheDuration 属性 public integer $wsdlCacheDuration;

生成的WSDL在缓存中保存的秒数,默认为0,即不缓存。

wsdlUrl 属性 public string $wsdlUrl;

WSDL的URL。在调用run()时必须提供此属性。

方法详细

__construct() 方法
public void __construct(mixed $provider, string $wsdlUrl, string $serviceUrl)
$providermixed提供web service的类或者对象。
$wsdlUrlstringWSDL的URL。调用run()方法时必须提供此项。
$serviceUrlstringWeb service的URL。调用generateWsdl()和renderWsdl()方法时必须提供此项。
源码: framework/web/services/CWebService.php#90 (显示) publicfunction__construct($provider,$wsdlUrl,$serviceUrl)
{
$this->provider=$provider;
$this->wsdlUrl=$wsdlUrl;
$this->serviceUrl=$serviceUrl;
}

构造方法。

generateWsdl() 方法
public string generateWsdl()
{return}string生成的WSDL
源码: framework/web/services/CWebService.php#132 (显示) publicfunctiongenerateWsdl()
{
$providerClass=is_object($this->provider)?get_class($this->provider):Yii::import($this->provider,true);
if($this->wsdlCacheDuration>0&&$this->cacheID!==false&&($cache=Yii::app()->getComponent($this->cacheID))!==null)
{
$key='Yii.CWebService.'.$providerClass.$this->serviceUrl.$this->encoding;
if(($wsdl=$cache->get($key))!==false)
return$wsdl;
}
$generator=newCWsdlGenerator;
$wsdl=$generator->generateWsdl($providerClass,$this->serviceUrl,$this->encoding);
if(isset($key))
$cache->set($key,$wsdl,$this->wsdlCacheDuration);
return$wsdl;
}

根据提供web service的类或者对象的定义生成WSDL。 若设置了缓存且缓存存在,那么会直接使用缓存中的内容。

参见

  • wsdlCacheDuration
getMethodName() 方法
public string getMethodName()
{return}string当前请求的方法名称。值为空则表示没有方法被请求。
源码: framework/web/services/CWebService.php#206 (显示) publicfunctiongetMethodName()
{
if($this->_method===null)
{
if(isset($HTTP_RAW_POST_DATA))
$request=$HTTP_RAW_POST_DATA;
else
$request=file_get_contents('php://input');
if(preg_match('/<.*?:Body[^>]*>s*<.*?:(w+)/mi',$request,$matches))
$this->_method=$matches[1];
else
$this->_method='';
}
return$this->_method;
}
getOptions() 方法
protected array getOptions()
{return}array创建SoapServer实例的相关配置项。
源码: framework/web/services/CWebService.php#226 (显示) protectedfunctiongetOptions()
{
$options=array();
if($this->soapVersion==='1.1')
$options['soap_version']=SOAP_1_1;
elseif($this->soapVersion==='1.2')
$options['soap_version']=SOAP_1_2;
if($this->actor!==null)
$options['actor']=$this->actor;
$options['encoding']=$this->encoding;
foreach($this->classMapas$type=>$className)
{
$className=Yii::import($className,true);
if(is_int($type))
$type=$className;
$options['classmap'][$type]=$className;
}
return$options;
}

参见

  • http://www.php.net/manual/en/function.soap-soapserver-construct.php
handleError() 方法
public void handleError(CErrorEvent $event)
$eventCErrorEventPHP错误事件
源码: framework/web/services/CWebService.php#101 (显示) publicfunctionhandleError($event)
{
$event->handled=true;
$message=$event->message;
if(YII_DEBUG)
{
$trace=debug_backtrace();
if(isset($trace[2])&&isset($trace[2]['file'])&&isset($trace[2]['line']))
$message.='('.$trace[2]['file'].':'.$trace[2]['line'].')';
}
thrownewCException($message,self::SOAP_ERROR);
}

PHP错误处理器。

renderWsdl() 方法
public void renderWsdl()
源码: framework/web/services/CWebService.php#118 (显示) publicfunctionrenderWsdl()
{
$wsdl=$this->generateWsdl();
header('Content-Type:text/xml;charset='.$this->encoding);
header('Content-Length:'.(function_exists('mb_strlen')?mb_strlen($wsdl,'8bit'):strlen($wsdl)));
echo$wsdl;
}

根据提供web service的类或者对象的定义生成和显示WSDL。

参见

  • generateWsdl
run() 方法
public void run()
源码: framework/web/services/CWebService.php#151 (显示) publicfunctionrun()
{
header('Content-Type:text/xml;charset='.$this->encoding);
if(YII_DEBUG)
ini_set("soap.wsdl_cache_enabled",0);
$server=newSoapServer($this->wsdlUrl,$this->getOptions());
Yii::app()->attachEventHandler('onError',array($this,'handleError'));
try
{
if($this->persistence!==null)
$server->setPersistence($this->persistence);
if(is_string($this->provider))
$provider=Yii::createComponent($this->provider);
else
$provider=$this->provider;

if(method_exists($server,'setObject'))
$server->setObject($provider);
else
$server->setClass('CSoapObjectWrapper',$provider);

if($providerinstanceofIWebServiceProvider)
{
if($provider->beforeWebMethod($this))
{
$server->handle();
$provider->afterWebMethod($this);
}
}
else
$server->handle();
}
catch(Exception$e)
{
if($e->getCode()!==self::SOAP_ERROR)//non-PHPerror
{
//onlylogfornon-PHP-errorcasebecauseapplication'serrorhandleralreadylogsit
//php<5.2doesn'tsupportstringconversionauto-magically
Yii::log($e->__toString(),CLogger::LEVEL_ERROR,'application');
}
$message=$e->getMessage();
if(YII_DEBUG)
$message.='('.$e->getFile().':'.$e->getLine().")n".$e->getTraceAsString();

//Weneedtoendapplicationexplicitlybecauseof
//http://bugs.php.net/bug.php?id=49513
Yii::app()->onEndRequest(newCEvent($this));
$server->fault(get_class($e),$message);
exit(1);
}
}

处理web service请求。