现在的位置: 首页 > IT运维 > 正文

amfphp使用

2013年05月24日 IT运维 ⁄ 共 3274字 暂无评论 ⁄ 被围观 16+

amfphp的两种方式

//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方式 
<mx:remoteobject id="service_user" destination="获取用户服务.." endpoint="{\'http://localhost/amfphp/gateway.php\'}" source="User" >
<mx:method name="login" result="resultHandler(event)" fault="mx.controls.Alert.show(event.fault.faultString)"></mx:method>
</mx:remoteobject>

注意:如果amfphp端返回值形式为:return $list,则直接使用ResultEvent(data).result接收;

如果以return array(\'list\'=>$list)返回,则使用ResultEvent(data).result.list接收

1.php接口文件名必须和类名相同

<p>2.php接口文件放置在amfphp/services/下即可通过Flex调用</p>
[php]PS:可以在amfphp/browser/index.html调试接口
PPS:可以在globals.php更改$servicesPath

3.如果接口返回中文字符的话,需要在amfphp/gateway.php的line127 设置对应的字符串编码

[string phpCharset][string sqlCharset]
第一个参数是设定要使用何种方式来重新编码传输的数据,如果是php5的话则可以放使用iconv,这是内建的模块。
第二个参数是设定系统预定的文字编码方式,如果要用中文的话就改成 utf-8。
第三个参数是设定该如何处理sql query result,也就是recordset的文字编码,同样的要用中文请设定成 utf-8。

4.php接口中全局变量的问题(连续2次问题都因此)

amfphp在调用php接口时是把这个接口文件include到amfphp本身的类里,所以include的时候就会出现在函数里global声明的变量获取不到,需要改成在声明该全局变量时就声明该变量global,详见http://cn2.php.net/manual/en/language.variables.scope.php#63500

5.如果加载大数据失败的话,可以调整amfphp/gateway.php的line151,把20调的更大些

比如$gateway->enableGzipCompression(200*1024);

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 通信

编写类文件,类名与文件名一样;
定义一个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

<mx:remoteobject id="service" source="Hello" destination="amfphp"
fault="rofault(event)" result="roresult(event)">
<mx:method name="nosay" fault="mdfault(event)"

result="mdresult(event)">
</mx:method>
</mx:remoteobject>

接下来,编辑serivces-config.xml修改其中的gateway

然后在编译时加入-services "services-config.xml"

------

如果你已经看懂使用Fluorine实现Flex与.NET通信这篇文章,你基本上明白了怎样实现Flash与Amfphp的通信。只是在Web应用的根目录不同而已,如下图。

Amfphp

我们改进了一下mxml,为sayHello方法添加了result 事件fault 和事件,当调用远程方法成功时就会侦听到result 事件并执行Actionscript代码块中的resultHandler方法,反之则会侦听到fault事件并执行faultHandle方法。代码加下:

 

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
  3. <mx:RemoteObject id="service" destination="amfphp"
  4. source="flashServices.remoting.HelloWorld" showBusyCursor="true" >
  5. <mx:method name="sayHello" result="resultHandler(event)"
  6. fault="faultHandler(event)" />
  7. </mx:RemoteObject>
  8. <mx:Script>
  9. <![CDATA[
  10. import mx.managers.CursorManager;
  11. import mx.rpc.events.ResultEvent;
  12. import mx.rpc.events.FaultEvent;
  13. private function resultHandler(re:ResultEvent):void
  14. {
  15. lblResult.text = re.result.toString();
  16. }
  17. private function faultHandler(fault:FaultEvent):void
  18. {
  19. CursorManager.removeBusyCursor();
  20. lblResult.text = "Message:" + fault.fault.faultString;
  21. }
  22. ]]>
  23. </mx:Script>
  24. <mx:TextInput id="txtName" />
  25. <mx:Button label="Say Hello" click="service.sayHello(txtName.text)" />
  26. <mx:Label id="lblResult" fontSize="18"/>
  27. </mx:Application>

运行测试一下,label将显示来自Amfphp Flash Remoting的问候。整一个错误出来,比如修改一下方法名或服务路径,再运行程序,label将显示错误信息。可见,这样的代码更像在Flash中使用Flash Remoting,更有扩展性。

给我留言

您必须 [ 登录 ] 才能发表留言!

×
#