Flex与PHP通信的最佳方法是什么?

8
什么是Flex和PHP之间最好的通信方法?
过去,我们使用AS2的AMFPHP,它在大部分情况下表现良好(AMFPHP的优势是它还有一个JSON模式,可以让您轻松地在Javascript或Actionscript前端使用相同的远程PHP)。
然而,似乎AMFPHP并没有得到真正的维护。那么人们推荐用什么来替代它呢?到目前为止,我找到的是:
  1. Zend_AMF(看起来对我们来说太复杂了,我们没有使用Zend框架)
  2. AMFPHP(有一些更新支持Flex,并且似乎相当稳定,但不确定长期支持情况)
  3. XML(AS3具有良好的XML处理例程,但在PHP方面更加麻烦)
  4. WebORB(我没有使用过这个)
  5. 自己编写,使用JSON或其他数据到文本序列化系统(php的serialize(),XML等等)

主要我倾向于使用AMFPHP,即使存在缺点,因为我已经习惯了。是否有任何理由考虑切换到其他东西?

12个回答

8
如果你想要快速高效的通讯,我强烈建议使用 AMF 协议 而不是 REST 或 JSON 自定义格式。 GotoAndLearn 上的介绍教程非常简单,所以请放心使用 {{strong:ZendAMF}}。
你应该知道,一些开发人员从 AMFPHP 转移到了 ZendAMF 工作。因此在某种意义上,ZendAMF 是 AMFPHP 的延续。

2

1

我不能告诉你什么是最好的(因为那可能有些主观),但我可以告诉你我的一个最近的项目。

由于这是一个非常丰富的 Web 应用程序,并且对服务器的数据请求将会很频繁,我希望确保请求的大小尽可能小。这意味着选择 JSON 作为格式。

接下来,由于应用程序的性质以及我的闪存/ Flex 开发人员距离我 1000 英里远,我需要一个简单和无状态的 API。最终,这使我们采用了 HTTP + REST。

因此,我的应用程序的通信层是一组简单的 Zend 框架支持的 REST 资源,其 URI 如下:

user/10
review/15
location/8/reviews

它们都返回JSON。所有错误都有一个通用的JSON格式(异常被捕获并转换为JSON对象),以便Flash客户端可以轻松处理失败。


感谢您的输入。AMF相对于JSON的优势在于它是一种二进制协议,因此在数据大小和编码/解码速度方面实际上比JSON更高效。 - davr
您始终可以使用gzip压缩的内容,因此也许您想坚持使用JSON——这更容易调试——AMF通常需要像Charles这样的Web代理进行调试。 - Seb
我感到很想要对任何再次提到REST的人进行点踩。Flex无法使用Flash的通信API,必须使用替代品才能实现REST。 - Samuel
@Samuel:Sora。我应该说是REST-like。我们在服务器上捕获异常并将500、404等转换为JSON错误数据,并强制使用200响应。不理解HTTP响应是Flex唯一的主要REST弱点:http://blogs.adobe.com/kiwi/2006/07/making_http_calls_in_actionscr.html - Peter Bailey
你忘了没有使用代理无法进行真正的RESTful调用,这是一个巨大的弱点。 - Samuel
显示剩余2条评论

1

1

如果您没有使用像Zend这样的框架,那么普通的AMFPHP仍然非常好,即使只是因为它很简单。我认为如果您感觉舒适,为什么不选择它呢?关于这些AMF接口的作用,它们真的不需要做太多事情,而且AMFPHP在类映射、记录集解析成ArrayCollection、出色的性能等方面都表现得非常出色......甚至在处理XML方面也表现良好,因为它可以进行压缩。结合Charles的服务浏览器也覆盖了我的需求。

我还没有能够弄清楚ZendAMF与原始AMFPHP之间的关系。虽然我可以深入挖掘,但我只是想说,在Nabble上关注AMFPHP邮件列表,阅读Wade Arnold的博客...这并不完全清楚。


是的,我早就开始使用AMFPHP了,现在我正在重新考虑这个选择,因为AMFPHP的未来对我来说并不十分清晰,也许自AS3推出以来已经编写了一个新的、更好的库/网关。但现在看来,坚持使用AMFPHP是最好的选择。 - davr

1
你应该考虑使用Zend AMF。Zend框架被设计成一个挑选框架,因此完全可以选择单个组件(在这种情况下是Zend AMF)用于你的应用程序。
Zend AMF非常容易使用。你只需要指定要公开的函数/类,并将类映射到你的ActionScript类即可。其他所有内容基本上都是透明的。

0

AMF具有相当情境优势。如果你要传输大型复杂对象,请务必选择AMF。但人们很少了解当你传输小对象时,AMF所带来的开销。如果你仅传输一个具有3个属性的对象,则使用AMF可能会使有效负载大小增加三倍。

顺便说一句,我是RESTful架构的坚定支持者。由于JSON和AMF都只是表示形式,因此您可以构建接受两者的REST服务,并在运行时与客户端协商实际表示形式。


AMFPHP实际上也有JSON接口,除了AMF。这就是我们正在使用的(虽然是旧版本的AMFPHP,但不知道新版本怎么样)。 - davr

0
在所有涉及Flash和PHP后端的项目中,我都使用AMFPHP或XML请求进行工作。
AMFPHP真正简化了未来维护应用程序的理解,尽管它将整个应用程序与特定技术联系起来,并在服务器端涉及一些额外的开销-以创建所有所需的类。
至于XML,您在这里获得的是标准REST Web服务,它不依赖于Flash(例如,您也可以从桌面应用程序中提取数据,而使用JSON或任何其他依赖于浏览器的技术则不允许这样做)。
如果您想要100%的未来“支持”,那么我建议选择根本不需要任何支持的东西:XML。

JSON 在浏览器中是如何依赖的? - rick
我感到有一些冲动,想要对任何再次提到REST的人进行投票否决。如果不使用Flash的通信API替代方案,Flex无法完全执行REST。 - Samuel
@rick:我的意思是JSON需要浏览器才能工作。如果你正在使用桌面应用程序,那么访问该Web服务可能会出现问题。 - Seb
当然它可以做到那个,它无法做到的是 REST。一个简单的 HTTP 请求并不是 REST。 - Samuel
正确,Flash(flex基于它)不能使用PUT或DELETE,仅限GET和POST。 - davr
显示剩余2条评论

0

使用SimpleXML,PHP上的XML可以变得更简单。

对于针对PHP API的简单调用,我建议使用JSON作为返回值。


0

我一定会选择WebORB。 我曾在以前的工作中与.NET一起使用它,编程非常愉快。 它易于使用且具有良好的管理控制台,使得学习速度非常快,其文档也非常完整。 我知道留在AMF上是很诱人的,只是因为你已经知道了它,但我相信值得尝试一下WebORB。

看一下这个screencast,用PHP生成ActionScript非常新颖。

干杯。


这个屏幕录像展示了如何使用ActionScript生成...但没有解释为什么要这样做,或者相比旧方法有什么优势。难道只是为了在代码编辑器中获得远程服务的自动完成吗? - davr
此外,还有一个稍微更好的语法。例如,在使用 AMFPHP 和内置的 Flex 远程类时,我可能会执行 'service.myCoolMethod.call("hello")',而在使用 WebORB 时则是 'service.myCoolMethod("hello")'... 所以我想你可以节省一些打字时间。 - davr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接