【问题标题】:Is it feasible to create a REST client with Flex?使用 Flex 创建 REST 客户端是否可行?
【发布时间】:2010-09-14 06:47:30
【问题描述】:

我正在使用用 Java 实现的 Restful 架构开始一个项目(使用新的 JAX-RS 标准)

我们计划使用 Flex 应用程序开发 GUI。我已经发现使用 HTTPService 组件的这个实现存在一些问题(响应错误代码、标头访问...)。

你们中的任何人都有类似项目的经验。可行吗?

【问题讨论】:

    标签: java apache-flex rest


    【解决方案1】:

    这里的问题是,很多围绕这个问题的网络讨论都是一年或更长时间。我现在正在做同样的研究,这就是我今天学到的。

    Jorge Rasillo 和 Mike Burr 的 IBM Developer Works article from August 2008 展示了如何制作 Flex 前端/RESTful 后端应用程序(PHP 和 Groovy 中的示例)。不错的文章。无论如何,这是要点:

    • 他们的 PHP/Groovy 代码使用并期望 PUT 和 DELETE。
    • 但 Flex 代码必须使用 POST,但将 HTTP 标头 X-Method-Override 设置为 DELETE(我认为您可以对 PUT 执行相同操作)。
    • 请注意,这不是上面讨论的代理方法。

    // Flex doesn't know how to generate an HTTP DELETE.
    // Fortunately, sMash/Zero will interpret an HTTP POST with
    // an X-Method-Override: DELETE header as a DELETE.
    deleteTodoHS.headers['X-Method-Override'] = 'DELETE';

    这里发生了什么? IBM Web 服务器截获“POST with DELETE”并将其解释为 DELETE。

    所以,我进一步挖掘并找到了这个post and discussion with Don Box(最初的 SOAP 家伙之一)。显然这是一种相当标准的行为,因为某些浏览器等不支持 PUT 和 DELETE,并且是一种已经存在一段时间的解决方法。这是一个 sn-p,但还有更多的讨论。

    “如果我正在构建一个 GData 客户端,我真的想知道为什么我会费心使用 DELETE 和 PUT 方法,因为 X-HTTP-Method-Override 将在更多情况/部署中工作。”

    我从中得出的结论是,如果您的 Web 端支持此 X-Method-Override 标头,那么您可以使用这种方法。 Don Box cmets 让我觉得它得到了很好的支持,但我还没有证实这一点。

    另一个问题是关于能够读取 HTTP 响应标头。同样,从a blog post in 2007 by Nathan de Vries,我们看到了这个讨论。他用自己的评论跟进了那篇博文和讨论:

    “Web 前端的唯一变化是 Flash Player 的较新版本(当然是 Flex 3 测试版提供的那些)现在支持 HTTPStatusEvent 实例的 responseHeaders 属性。”

    我希望这意味着它现在不是问题。

    【讨论】:

    • 我认为问问自己使用“X-HTTP-Method-Override”的客户端是否失去了 REST 的一些好处也很重要。这种方法真的与通过 HTTP 建立隧道有什么不同吗?您不会失去利用缓存代理和其他此类优势的能力吗?
    • 如果您在第 13.10 节查看w3.org/Protocols/rfc2616/rfc2616-sec13.html,您会看到 PUT、DELETE 和 POST 都会导致缓存条目无效。因此,无论您是使用正确的动词还是 POST 加 X-HTTP-Method-Override,您对缓存的效果都是一样的。
    • @Gili 要回答您的第一个问题,不,您不会失去 REST 的任何好处。
    【解决方案2】:

    正如许多人指出的那样,HTTPService 有点简单,并没有做你想做的所有事情。然而,HTTPService 只是 flash.net.* 类(如 URLLoaderURLRequestURLRequestHeader)之上的糖。使用这些,您可以组装大多数 HTTP 请求。

    当涉及到对 GET 和 POST 之外的其他方法的支持时,问题主要在于某些浏览器(例如 Safari)不支持这些,而 Flash Player 的所有网络都依赖于浏览器。

    【讨论】:

      【解决方案3】:

      Flex 作为纯 RESTful 客户端的能力存在明显的缺陷。

      下面的cmets来自这个blog

      问题是 HTTPService 类有 几个主要限制:

      1. 开箱即用仅支持 GET 和 POST 方法(除非您 使用 FDS 并将 useProxy 属性设置为 真的)
      2. 无法设置请求标头并且无法访问响应 标题。因此我无法 访问案例中的响应正文 的错误。
      3. 它认为 HTTPService 得到一个状态码是 200 以外的任何值 一个错误。 (事件 201,哎哟!!)。这 FaultEvent 不提供信息 关于状态码任何响应 身体。 Flex 客户端将没有 知道出了什么问题。

      Matt Raible 还提供了一个nice presentation on REST with Rails, Grails, GWT and Flex,其中链接了一些很好的参考资料。

      这是否可行取决于您愿意通过代理等工作的程度。

      【讨论】:

      • 如果这些限制是正确的,那么 Flex 不适合 REST over http。能够访问所有 HTTP 标头至关重要。
      【解决方案4】:

      我一直致力于开发完全支持 REST 的 HTTPService 组件的开源替代品。如果有兴趣,您可以在此处找到测试版(源代码和/或编译后的 Flex 共享运行时库)和说明:

      http://code.google.com/p/resthttpservice/

      【讨论】:

        【解决方案5】:

        简短的回答是肯定的,您可以使用 Flex 实现 RESTful。您只需要解决 Flash 播放器的限制(使用最新版本更好)和包含浏览器的 HTTP 堆栈限制。

        在通过 rails-esque ?_method= 方法解决了基本的 HTTP 请求标头以及缺少 PUT 和 DELETE 问题后,我们已经在 Flex 中进行 RESTful 客户端开发一年多了。也许俗气,但它可以完成工作。

        我在 http://verveguy.blogspot.com/2008/07/truth-about-flex-httpservice.html 的一篇旧博客文章中注意到了一些标题问题

        【讨论】:

        • 模糊:你没有抓住重点。 _method= hack 是处理实际上无法进行真正 PUT 和 DELETE 调用的浏览器(和 Flash Player)所必需的。 Rails 使用了相同的解决方法...
        【解决方案6】:

        Flex 对 REST 的支持充其量是很弱的。我花了很多时间构建原型,所以我知道大部分问题。如前所述,开箱即用仅支持 GET 和 POST。乍一看,您似乎可以使用 LiveCycle Data Services 或 Blaze 中的代理配置来获得对 PUT 和 DELETE 的支持。然而,它是一个骗局。来自您的 Flex 应用程序的请求仍将是 ​​POST。代理将其转换为服务器端的 PUT 或 DELETE 以欺骗您的服务器端代码。还有其他问题。听说这是 Adob​​e 所能想到的最好的。经过我的评估,我们决定朝另一个方向前进。

        【讨论】:

          【解决方案7】:

          是的,我可以通过这个组件使用 POST 和访问标头:

          http://code.google.com/p/as3httpclient/wiki/Links

          Example

          【讨论】:

            【解决方案8】:

            我现在正在开发一个严重依赖于 Flex 与 JavaScript 和 Java Servlet 之间的 REST 调用的应用程序。我们通过建立一个在错误时返回的 块的约定来解决响应错误代码问题,错误 ID 大致映射到 HTTP 错误代码。

            我们通过使用 Java Servlet 作为 HTTP 代理解决了跨站点脚本的限制。对代理的调用(它在为其余内容(包括 Flex 内容)提供服务的同一台服务器上运行,将请求发送到其他服务器,然后将响应发送回原始调用者。

            【讨论】:

              【解决方案9】:

              RestfulX 解决了 Flex 的大部分/所有 REST 问题。它支持 Rails/GAE/Merb/CouchDB/AIR/WebKit,我相信将它连接到您的 Java 实现会很容易。

              Dima 也将 AS3HTTPClient 库集成到其中。

              看看吧!

              【讨论】:

                【解决方案10】:

                实际上已经在使用带有 Rest-Style 框架的 Flex。正如 mbrevort 已经提到的那样,不能直接使用 PUT 和 DELETE 方法。相反,我们通过 POST 执行 PUT,而对于 DELETE,我们使用 GET 对具有 URL 参数(如 ?action=delete)的资源。

                这不是 100% Rest 风格,所以我不确定这是否适用于 JSR 311 实现。您需要在服务器端具有一定的灵活性来解决 PUT 和 DELETE 限制。

                关于错误处理,我们实施了错误服务。如果发生服务器端错误,Flex 应用程序可以查询此错误服务以获取实际的错误消息。这也比仅仅将 HTTP 返回码映射到静态消息灵活得多。

                不过,感谢 Flex 的 ECMA 脚本,使用基于 XML 的 REST 服务非常容易。

                【讨论】:

                • 这是 RPC over HTTP,甚至不接近 REST
                • 好吧,实际上介于两者之间。 REST 有 4 种方法,其中两种必须以不同的方式实现,因为所需的 HTTP 动词不可用。
                【解决方案11】:

                REST 更像是一种意识形态。你去参加 REST 演示,他们有coolaide 分配器。

                对于 Flex 应用,滚动堆栈与 BlazeDS 和 AMF 数据编组结合使用更方便、性能更高。

                【讨论】:

                • 哇,太好了,告诉我更多。我爱库莱德。顺便说一句,比什么“性能更高”?
                【解决方案12】:

                我过去的管理方式是使用 PHP 代理来处理远程 Web 服务调用并将 RTU JSON 返回给客户端..

                【讨论】:

                  【解决方案13】:

                  可能是新的 flex 4 是答案http://labs.adobe.com/technologies/flex4sdk/

                  【讨论】:

                    【解决方案14】:

                    Flexible Rails 这本书可能会有所帮助——它是关于如何将 Flex 用作 RESTful 客户端的极好资源。尽管它侧重于将 Flex 与 Rails 框架结合使用,但我相信这些概念适用于任何 RESTful 框架。我使用这本书来快速了解如何将 Flex 与 REST 结合使用。

                    【讨论】:

                      【解决方案15】:

                      我为富兰克林柯维从事一个大型的弹性项目。我们使用 REST 服务。为了支持这一点。我们创建了一个 XMLHttpRequest 包装器。通过使用带有一些事件处理程序的外部接口。我们开源了这个库。你可以在https://github.com/FranklinCovey/AS3-XMLHttpRequest查看它

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2017-05-31
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2012-08-22
                        • 2016-01-29
                        • 2015-10-03
                        相关资源
                        最近更新 更多