我将 Rails 开发视为 Flex 应用程序的后端,并试图找出 Rails 应用程序和 Flash Player 之间的通信层。我发现的所有东西都建议使用 SOAP Web 服务进行通信。
然而,Flash 支持 AMF,它既好又快(而且是原生的)。有什么方法可以通过 Rails 应用程序通过 AMF 进行通信,同时支持有关 AMF 的所有“好”功能(自动类型转换、数据推送等)。
我将 Rails 开发视为 Flex 应用程序的后端,并试图找出 Rails 应用程序和 Flash Player 之间的通信层。我发现的所有东西都建议使用 SOAP Web 服务进行通信。
然而,Flash 支持 AMF,它既好又快(而且是原生的)。有什么方法可以通过 Rails 应用程序通过 AMF 进行通信,同时支持有关 AMF 的所有“好”功能(自动类型转换、数据推送等)。
您可以使用WebORB或RubyAMF从 Rails 在 AMF 中进行响应,每种方法都有所不同,因此取决于您的需求。RubyAMF 在Flexible Rails电子书的最后几章中进行了讨论,这是一个很好的将 Rails 与 Flex 结合使用的资源。
我正在编写一个 rails/flex 应用程序,我们正在转向在 REST 框架中使用 JSON 通信。来自 Flex 端处理 JSON 响应的简单 HTTP 请求似乎是分离客户端和服务器的最佳方式。XML 同样简单。
值得一提的是,我们也在 flex 端使用 PureMVC 框架,将响应保存在客户端模型中。
您不会使用 SOAP Web 服务,而是使用 Rails 中原生的“本机”REST Web 服务。上面 DEFusion 引用的那本书实际上是关于:如何使用 FLEX 客户端作为使用 REST(即 XML)的 Rails 应用程序的前端。
AMF 协议主要由 Adobe 构建为二进制协议,以允许 FLEX 前端与 CodeFusion 以及 Java 服务器应用程序进行通信。它不是免费的,除了使用 Adobe 的 BlazeDS,您实际上不会获得太多支持。然后当然,您必须选择一个能够使用 AMF 协议与 BlazeDS 对话的插件(再次参见 DEfusion 的帖子)并依赖它。
您会惊讶于通过 REST 将 Flex 直接连接到 Rails 的效果如何,而且您不必依赖第三方。我建议你试试看。
希望这可以帮助
如果您想要与可以响应/生成 AMF 的控制器进行 MVC 样式交互,请使用 RubyAMF。
将 WebOrb 用于任何其他样式,包括直接访问模型对象。
我已经使用所有三种方法(WebOrb、RubyAMF、REST)构建了应用程序......
WebOrb for Rails 几乎已经死了,它已经有一段时间没有更新了。也就是说,我能够创建一些 Flex/Ruby 魔法,使 Flex 对 Rails 的模型对象的访问变得透明……如果您有兴趣,我会挖掘它并发送给您。
RubyAMF 很好,但不如 WebOrb 灵活(哈哈!)。
返回 JSON 的 REST 非常简单,如果我必须构建另一个(我希望不会),我将继续使用它。
YMMV。
有一个名为WebORB for Ruby on Rails的 Rails 插件,它使用 AMF 进行远程处理。
你可以使用 WebORB 或 RubyAMF,或者只是简单的 XML——Rails 在 XML 方面非常聪明,这里和那里都有一些陷阱。
我们几乎完全使用 XML 在 Rails 应用程序和 Flex Web 应用程序之间进行通信。这很简单。
要从 Rails 应用程序中检索数据,只需创建一个 result_type 为 e4x 的 HTTPService,然后调用您的 url。在您的 Rails 控制器中,执行以下操作:
def people
render :xml => Person.all.to_xml
end
有时,Rails 会将标签添加到末尾。如果发生这种情况,请将您的控制器更改为:
def people
render :xml => Person.all.to_xml.target!
end
如果您想将数据发送到 Rails 应用程序,这同样简单..
<mx:HTTPService id="theservice" url="http://localhost:3000/svc/add_person" method="POST">
<mx:request>
<person>
<first>Firstname</first>
<last>Lastname</last>
</person>
</request>
</HTTPService>
在你的控制器中:
def add_person
p=Person.create(params[:person])
render :xml => {:result => "Success"}.to_xml.target!
end