amfphp的两种方式
[php]//as方式
var ro_login:RemoteObject;
ro_login = new RemoteObject();
ro_login.source = "User";
ro_login.destination = "用户相关操作";//可选参数
ro_login.endpoint = "http://localhost/amfphp/gateway.php";
ro_login.login.addEventListener("result", resultHandler);//RemoteObject是动态类,可以动态添加属性,这里login就是User.php里类User的login方法。
ro_login.login.addEventListener("fault", onFault);
//MXML方式
注意:如果amfphp端返回值形式为:return $list,则直接使用ResultEvent(data).result接收;
如果以return array('list'=>$list)返回,则使用ResultEvent(data).result.list接收
1.php接口文件名必须和类名相同
[php 1="paint{…}[/php" language="例如:paint.php中的类必须用class"]
2.php接口文件放置在amfphp/services/下即可通过Flex调用
[php]PS:可以在amfphp/browser/index.html调试接口
PPS:可以在globals.php更改$servicesPath[/php]
3.如果接口返回中文字符的话,需要在amfphp/gateway.php的line127 设置对应的字符串编码
[php 1=""UTF-8″," 2=""UTF-8″);" 3="[string" 4="mode" language="例如:$gateway->setCharsetHandler("utf8_decode","][string phpCharset][string sqlCharset]
第一个参数是设定要使用何种方式来重新编码传输的数据,如果是php5的话则可以放使用iconv,这是内建的模块。
第二个参数是设定系统预定的文字编码方式,如果要用中文的话就改成 utf-8。
第三个参数是设定该如何处理sql query result,也就是recordset的文字编码,同样的要用中文请设定成 utf-8。[/php]
4.php接口中全局变量的问题(连续2次问题都因此)
[php]amfphp在调用php接口时是把这个接口文件include到amfphp本身的类里,所以include的时候就会出现在函数里global声明的变量获取不到,需要改成在声明该全局变量时就声明该变量global,详见http://cn2.php.net/manual/en/language.variables.scope.php#63500[/php]
5.如果加载大数据失败的话,可以调整amfphp/gateway.php的line151,把20调的更大些
[php]比如$gateway->enableGzipCompression(200*1024);[/php]
6.gateway类的service方法会输出自己的header,如果对应的services也输出header信息的话可能会在ie7下报错。(bug#1076)
7、{"room":1, "table":1, "seat":1} 在amfphp/browser/里传递数组参数时,使用前面这种格式
8、只能接收return值,不能接收echo print_r等的输出值
ps: 以下是大体用法,不太细,具体的找其它教程看下。
使用NetConnection+Responder与amfphp 通信
[php]编写类文件,类名与文件名一样;
定义一个url指到ampphp中的gateway.php
实例化NetConnection,调用其connect方法,参数就是上边定义的url
调用NetConnection实例的call方法,
(php类.方法,responder,方法中需要的参数),
其中的responder有两个参数,是两个函数,分别表示调用成功(result:object)和失败(result:String)
对于中文字符,需要修改一下gateway.php,修改字符集与你的应用程序适用
$gateway->setCharsetHandler("iconv", "UTF-8", "UTF-8");
也需要指定php中的查询数据库时的编码
mysql_query("set names utf8");
使用RemoteObject与amfphp
编写类文件,类名与文件名一样;
定义RemoteObject,指定id source destination
接下来,编辑serivces-config.xml修改其中的gateway
然后在编译时加入-services "services-config.xml"
------
如果你已经看懂使用Fluorine实现Flex与.NET通信这篇文章,你基本上明白了怎样实现Flash与Amfphp的通信。只是在Web应用的根目录不同而已,如下图。
我们改进了一下mxml,为sayHello方法添加了result 事件fault 和事件,当调用远程方法成功时就会侦听到result 事件并执行Actionscript代码块中的resultHandler方法,反之则会侦听到fault事件并执行faultHandle方法。代码加下:
- <?xml version="1.0" encoding="utf-8"?>
- <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
- <mx:RemoteObject id="service" destination="amfphp"
- source="flashServices.remoting.HelloWorld" showBusyCursor="true" >
- <mx:method name="sayHello" result="resultHandler(event)"
- fault="faultHandler(event)" />
- </mx:RemoteObject>
- <mx:Script>
- <![CDATA[
- import mx.managers.CursorManager;
- import mx.rpc.events.ResultEvent;
- import mx.rpc.events.FaultEvent;
- private function resultHandler(re:ResultEvent):void
- {
- lblResult.text = re.result.toString();
- }
- private function faultHandler(fault:FaultEvent):void
- {
- CursorManager.removeBusyCursor();
- lblResult.text = "Message:" + fault.fault.faultString;
- }
- ]]>
- </mx:Script>
- <mx:TextInput id="txtName" />
- <mx:Button label="Say Hello" click="service.sayHello(txtName.text)" />
- <mx:Label id="lblResult" fontSize="18"/>
- </mx:Application>
运行测试一下,label将显示来自Amfphp Flash Remoting的问候。整一个错误出来,比如修改一下方法名或服务路径,再运行程序,label将显示错误信息。可见,这样的代码更像在Flash中使用Flash Remoting,更有扩展性。