CWebService
优质
小牛编辑
141浏览
2023-12-01
所有包 | 属性 | 方法
CWebService封装了SOAP服务和提供基于WSDL的WebService。
本类需要PHP的SOAP扩展方可正常运行。
CWebService利用CWsdlGenerator便可自动联机生成WSDL, 免去自己写WSDL的复杂麻烦。
生成WSDL是基于服务提供类中的注释块, 调用generateWsdl或者renderWsdl。处理web service 请求,调用run。
源码: framework/web/services/CWebService.php#90 (显示)
源码: framework/web/services/CWebService.php#132 (显示)
源码: framework/web/services/CWebService.php#206 (显示)
源码: framework/web/services/CWebService.php#226 (显示)
源码: framework/web/services/CWebService.php#101 (显示)
源码: framework/web/services/CWebService.php#118 (显示)
源码: framework/web/services/CWebService.php#151 (显示)
包 | system.web.services |
---|---|
继承 | class CWebService » CComponent |
源自 | 1.0 |
版本 | $Id: CWebService.php 3515 2011-12-28 12:29:24Z mdomba $ |
源码 | framework/web/services/CWebService.php |
本类需要PHP的SOAP扩展方可正常运行。
CWebService利用CWsdlGenerator便可自动联机生成WSDL, 免去自己写WSDL的复杂麻烦。
生成WSDL是基于服务提供类中的注释块, 调用generateWsdl或者renderWsdl。处理web service 请求,调用run。
公共属性
隐藏继承属性
属性 | 类型 | 描述 | 定义在 |
---|---|---|---|
actor | string | 指定SOAP service的actor。默认为null,即不指定。 | CWebService |
cacheID | string | 用于在缓存组件中缓存已经生成的WSDL的ID。 默认值为’cache‘,提交到主缓存组件。 如果不使用缓存,请设置为False。 | CWebService |
classMap | array | 在WSDL中被声明为复杂类型的类的列表。 这应该是一个以WSDL中声明的类型为Key,对应的PHP类名为值的数组。 类名可以使用别名来表示。 | CWebService |
encoding | string | Web service的编码类型。默认为‘UTF-8’。 | CWebService |
methodName | string | 当前请求的方法名称。值为空则表示没有方法被请求。 | CWebService |
persistence | integer | SOAP server的持久模式。 | CWebService |
provider | string|object | 提供web service的类或者对象。 当值为名称时,此处可以使用别名来表示。 | CWebService |
serviceUrl | string | Web service的URL。在调用generateWsdl()和renderWsdl()时必须提供此属性。 | CWebService |
soapVersion | string | 指定SOAP版本(例如:‘1. | CWebService |
wsdlCacheDuration | integer | 生成的WSDL在缓存中保存的秒数,默认为0,即不缓存。 | CWebService |
wsdlUrl | string | WSDL的URL。在调用run()时必须提供此属性。 | CWebService |
受保护属性
隐藏继承属性
属性 | 类型 | 描述 | 定义在 |
---|---|---|---|
options | array | 创建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
Web service的编码类型。默认为‘UTF-8’。
methodName 属性 只读 public string getMethodName()当前请求的方法名称。值为空则表示没有方法被请求。
options 属性 只读 protected array getOptions()创建SoapServer实例的相关配置项。
参见
- http://www.php.net/manual/en/function.soap-soapserver-construct.php
SOAP server的持久模式。
参见
- http://www.php.net/manual/en/function.soap-soapserver-setpersistence.php
提供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) | ||
$provider | mixed | 提供web service的类或者对象。 |
$wsdlUrl | string | WSDL的URL。调用run()方法时必须提供此项。 |
$serviceUrl | string | Web service的URL。调用generateWsdl()和renderWsdl()方法时必须提供此项。 |
publicfunction__construct($provider,$wsdlUrl,$serviceUrl)
{
$this->provider=$provider;
$this->wsdlUrl=$wsdlUrl;
$this->serviceUrl=$serviceUrl;
}
构造方法。
generateWsdl() 方法public string generateWsdl() | ||
{return} | string | 生成的WSDL |
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
public string getMethodName() | ||
{return} | string | 当前请求的方法名称。值为空则表示没有方法被请求。 |
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实例的相关配置项。 |
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
public void handleError(CErrorEvent $event) | ||
$event | CErrorEvent | PHP错误事件 |
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() |
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
public void run() |
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请求。