`
zccst
  • 浏览: 3310084 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在yii中soap协议的配置和使用

 
阅读更多
作者:zccst

1,定义Service Provider
Yii依靠文档注解(doc comments)和类反射(class reflection)来识别哪个方法可以被远程调用,包括他们的参数和返回值。

我们定义服务器端的类,继承CController,如下面的例子所示:
class StockController extends CController{
	/**
	* @param String         the symbol of the stock
	* @return float         the stock price
	* @soap
	*/
	public function getPrice($symbol){
		$prices = array('IBM'=>100, 'GOOGLE'=>350);
		return isset($prices[$symbol]) ? $prices[$symbol] : 0;
		// ... return stock price for $symbol
	}
}

在上面的例子中,我们定义了方法getPrice(使用@soap)作为一个可供远程调用的API,并且通过文档注解(doc comments)来指定参数和返回值的数据类型。

批注:后面会讲数据类型可分为基本数据类型和复合数据类型。

2,定义 Web Service Action
既然前面已知服务器端类是继承自CController,所以需要定义一个action,将服务暴露出去。继续上面的例子,我们仅仅在StockController增加如下代码:
class StockController extends CController{
	/***********  增加  start  **************/
	public function actions(){
		return array(
			'quote'=>array(
				'class'=>'CWebServiceAction'
			),
		);
	}
	/***********  增加  end  **************/


	/**
	* @param String         the symbol of the stock
	* @return float         the stock price
	* @soap
	*/
	public function getPrice($symbol){
		$prices = array('IBM'=>100, 'GOOGLE'=>350);
		return isset($prices[$symbol]) ? $prices[$symbol] : 0;
		// ... return stock price for $symbol
	}
}



至此,如果我们访问地址:http://hostname/path/to/index.php?r=stock/quote
我们将得到一个包含大量XML格式的内容,实际上它就是上面Web Service定义的WSDL。


批注:缺省情况下,CWebServiceAction默认当前controller就是Service Provider,这就是为什么上面直接在StockController里定义getPrice方法。


3,在客户端调用:(可以使用多种语言)
$client = new SoapClient('http://hostname/path/to/index.php?r=stock/quote');
echo $client->getPrice('GOOGLE');

//运行上面的脚本,通过Web或命令行方式,可以得出结果:350



4,关于参数和返回值的数据类型
在实际应用中,参数和返回值的数据类型可分为基本数据类型和复合数据类型。

(1)基本类型数据
string , integer , float, boolean, date, time, datetime, array , object, mixed

(2)复合类型数据
如果是复合数据类型,则复合数据类型会通过类的形式表示,这时它的每一个public的数据项都需要使用@soap来进行文档注解(doc comments)。例如:
class outsource_header {
	/**
	 * @var string 访问密钥, a和b之间的访问控制
	 * @soap
	 */
	public $token;

	/**
	 * @var integer 外包单号
	 * @soap
	 */
	public $id;

	/**
	 * @var string 该外包单对应的机房名称
	 * @soap
	 */
	public $idc_name;

	/**
	 * @var outsource_handler 处理人信息
	 * @soap
	 */
	public $handler;	// 处理人信息
}

需要注意的是,如果想让client端收到复合类型数据,除了上面给出的类定义外,还需要在Service Provider的actions方法里增加配置项classMap=>array('outsource_header')。如下面所示:
class XXController extends CController{
	public function actions(){
		return array(
			'service'=>array(
				'class'=>'CWebServiceAction',
				//增加  classMap 配置项
				'classMap'=>array(
					'outsource_header',
				),
			),
		);
	}
}





此外,复合数据类型也可以使用数组(Array),通过[]向基本数据类型或复合数据类型的末尾追加的方式。例如,
class PostController extends CController{
	/**
	* @return Post[]       a list of posts
	* @soap
	*/
	public function getPosts(){
		return Post::model()->findAll();
	}
}

class Post extends CActiveRecord{
	/**
	 * @var integer    post ID
	 * @soap
	 */
	public $id;
	/**
	 * @var string     post title
	 * @soap
	 */
	public $title;

	public static function model($className=__CLASS__){
		return parent::model($className);
	}
}

该实例,调用getPosts方法时,将返回一个数组。


5,拦截远程方法调用(Intercepting Remote Method Invocation)
通过实现[IWebServiceProvider]接口,可以拦截所有方法,在[IWebServiceProvider::beforeWebMethod],这个provider可以获取当前CWebService实例,并通过CWebService::methodName来获取当前请求的方法名,它可以返回false,如果这个远程方法因某些原因(比如未经授权的访问)不应被调用。

如果您觉得本文的内容对您的学习有所帮助,您可以微信:

分享到:
评论

相关推荐

    yii2-soap-client:Yii 2 的 SOAP 客户端扩展

    要么跑 composer require --prefer-dist mongosoft/yii2-soap-client "*"或添加 " mongosoft/yii2-soap-client " : " * " 到composer.json文件的require部分。用法您需要设置soap客户端应用程序组件: 'components'...

    Yii2Configloader从配置文件和环境变量构建配置数组

    这使得在不同环境中使用不同的配置变得更加简单,无需修改配置文件。例如,数据库密码可以通过环境变量安全地存储,而不是硬编码在配置文件中。 4. **动态加载**:ConfigLoader 在运行时加载配置,这意味着开发者...

    yii框架中文手册教程和YII模板

    在“yii-1.1.8.r3324.tar.gz”文件中,包含的是Yii框架的1.1.8版本源码,这是一个相对稳定的版本。解压后,开发者可以查看源代码,了解框架内部的工作机制,也可以根据需求进行自定义修改。此外,版本号中的“r3324...

    yii框架中文文档、yii中文手册教程

    在“yii1.1中文文档”中,包含了Yii 1.1版本的详尽教程和参考指南。这个版本是Yii框架的一个稳定版本,尽管现在已经有了更新的2.0版本,但仍然有许多项目基于1.1版本运行。文档通常会涵盖框架的基础知识,如MVC...

    yii2-soap-server:Yii 2 的 SOAP 服务器扩展

    Yii 2 的 SOAP 服务器扩展 ... 注意,在服务类中,远程可调用方法必须是带有包含“@soap”标记的文档注释块的公共方法。 class ApiController extends Controller { /** * @inheritdoc */ public function acti

    YII 配置文件,不同的环境不同的配置

    6. **缓存配置**:类似地,缓存设置也可以根据环境进行调整,例如在生产环境中使用更高效的Redis或Memcached,而在开发环境中使用内存缓存。 7. **安全配置**:在生产环境中,可能会开启GZIP压缩、设置安全的Cookie...

    yii配置 商城开发配置

    商城开发的配置 yii2的 里面是代码可以详细的知道所有

    YII配置详解以及开发规范

    CComponent 是 Yii 中所有类的基类,提供事件和行为机制,使得扩展功能变得简单。Yii 的组件化设计允许开发者轻松替换如 session、cache 等组件,而无需大规模重构代码。延迟加载机制确保只有在真正需要时才会加载...

    yii的小部件使用

    通过对Yii框架中小部件的使用以及利用gii工具快速生成增删改查功能的学习,我们可以看到,通过合理利用这些工具和技术,可以极大地提高Web应用的开发效率。特别是在处理常见的CRUD操作时,利用gii工具自动生成代码...

    YII2数据库MySQL复制和读写分离配置

    在YII2应用中使用读写分离,可以通过配置数据库组件实现。YII2框架提供了一套完整的数据库访问和操作的API,开发者可以利用这些API方便地配置读写分离。 实现读写分离的方式主要有以下几种: 1. 使用第三方组件或...

    YII框架中文手册

    **Yii框架中文手册** Yii(读作"易")是一个高性能、基于组件的PHP框架,专为开发...在实际开发中,不断查阅并理解Yii中文手册,结合实例操作,将理论知识转化为实践经验,将有助于提升开发者在Yii框架下的编程技能。

    YII-1.1.8中文手册

    - **组件**:Yii中的所有对象都是组件,可以被配置和复用,增强了代码的灵活性。 - **数据库访问对象(DAO)和ActiveRecord**:提供简便的数据操作,ActiveRecord允许开发者通过对象操作数据库记录。 - **缓存**...

    yii1.1中文手册

    1. **MVC模式**:在Yii中,MVC模式用于分离业务逻辑、数据和用户界面。模型(Model)处理数据和业务逻辑,视图(View)负责显示数据,控制器(Controller)协调模型和视图之间的交互。 2. **DAO和ActiveRecord**:...

    Yii2中文手册(中文教程完整版)

    编撰中 数据库迁移(Migration) - 在团体开发中对你的数据库使用版本控制 待定中 Sphinx 待定中 Redis 待定中 MongoDB 待定中 ElasticSearch 接收用户数据 编撰中 创建表单 已定稿 输入验证 编撰中 文件上传 待定中...

    yii手册 中文 chm格式

    8. **缓存**:涵盖了多种缓存机制,如文件缓存、内存缓存(如APC、Memcached或Redis),以及如何在应用中集成和使用它们。 9. **安全**:涉及到身份验证、授权、防止XSS和CSRF攻击等安全性相关的主题。 10. **国际...

    Yii2使用resful api接口

    在Yii2中实现RESTful API,首先需要理解如何配置`modules`。`modules`是Yii2中的一个核心特性,允许我们将应用划分为独立的可重用部分,每个部分称为一个模块。模块可以有自己的模型、视图、控制器和配置,这使得...

    yii2swoole让yii2运行在swoole上

    2. **性能提升**:"运行在swoole上的yii2是运行在php-fpm上yii2的5倍以上"表明使用Swoole后,Yii2应用的处理速度和响应能力显著增强。Swoole的异步非阻塞I/O模型相比传统的PHP-FPM(FastCGI进程管理器)模型,可以...

Global site tag (gtag.js) - Google Analytics