我正在使用用 Java 实现的 Restful 架构开始一个项目(使用新的 JAX-RS 标准)
我们计划使用 Flex 应用程序开发 GUI。我已经发现使用 HTTPService 组件的这个实现存在一些问题(响应错误代码、标题访问......)。
你们中的任何人都有类似项目的经验。可行吗?
我正在使用用 Java 实现的 Restful 架构开始一个项目(使用新的 JAX-RS 标准)
我们计划使用 Flex 应用程序开发 GUI。我已经发现使用 HTTPService 组件的这个实现存在一些问题(响应错误代码、标题访问......)。
你们中的任何人都有类似项目的经验。可行吗?
这里的问题是,很多围绕这个问题的网络讨论已经有一年或更长时间了。我现在正在做同样的研究,这就是我今天学到的。
Jorge Rasillo 和 Mike Burr 于 2008 年 8 月撰写的这篇IBM Developer Works 文章展示了如何制作 Flex 前端/RESTful 后端应用程序(PHP 和 Groovy 中的示例)。不错的文章。无论如何,这里是外卖:
// 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。
因此,我进一步挖掘并找到了这篇文章并与 Don Box(最初的 SOAP 人之一)进行了讨论。显然这是一种相当标准的行为,因为某些浏览器等不支持 PUT 和 DELETE,并且是一种已经存在一段时间的解决方法。这是一个片段,但还有更多的讨论。
“如果我正在构建一个 GData 客户端,我真的想知道为什么我会费心使用 DELETE 和 PUT 方法,因为 X-HTTP-Method-Override 将在更多情况/部署中工作。”
我从中得出的结论是,如果您的 Web 端支持此 X-Method-Override 标头,那么您可以使用这种方法。Don Box 的评论让我觉得它得到了很好的支持,但我还没有证实这一点。
另一个问题是关于能够读取 HTTP 响应标头。同样,从Nathan de Vries 2007 年的一篇博文中,我们看到了这一点的讨论。他用自己的评论跟进了那篇博文和讨论:
“Web 前端的唯一变化是 Flash Player 的较新版本(当然是 Flex 3 beta 提供的那些)现在支持 HTTPStatusEvent 实例的 responseHeaders 属性。”
我希望这意味着它现在不是问题。
正如许多人指出的那样HTTPService
,这有点简单,并没有做你想做的所有事情。但是,这只是,和等类HTTPService
之上的糖。使用这些,您可以组装大多数 HTTP 请求。flash.net.*
URLLoader
URLRequest
URLRequestHeader
当涉及到对 GET 和 POST 以外的其他方法的支持时,问题主要在于某些浏览器(例如 Safari)不支持这些方法,而 Flash Player 的所有网络都依赖于浏览器。
Flex 充当纯 RESTful 客户端的能力存在明显的缺陷。
以下评论来自此博客:
问题是 HTTPService 类有几个主要限制:
- 开箱即用仅支持 GET 和 POST 方法(除非您使用 FDS 并将 useProxy 属性设置为 true)
- 无法设置请求标头,也无法访问响应标头。因此,如果出现错误,我将无法访问响应正文。
- 它 HTTPService 得到一个 200 以外的状态码,它认为是一个错误。(事件 201,哎哟!!)。FaultEvent 不提供有关任何响应正文的状态代码的信息。Flex 客户端不知道出了什么问题。
Matt Raible还对带有 Rails、Grails、GWT 和 Flex 的 REST 做了一个很好的介绍,其中有一些很好的参考链接。
它是否可行实际上取决于您愿意通过代理等来解决多少问题。
我一直在研究完全支持 REST 的 HTTPService 组件的开源替代品。如果有兴趣,您可以在此处找到 beta 版本(源代码和/或编译后的 Flex 共享运行时库)和说明:
简短的回答是肯定的,你可以用 Flex 做 RESTful。您只需要解决 Flash 播放器的限制(使用最新版本更好)和包含浏览器的 HTTP 堆栈限制。
在通过 rails-esque ?_method= 方法解决了基本的 HTTP 请求标头以及缺少 PUT 和 DELETE 之后,我们在 Flex 中进行 RESTful 客户端开发已经有一年多了。也许俗气,但它可以完成工作。
我在http://verveguy.blogspot.com/2008/07/truth-about-flex-httpservice.html的一篇旧博客文章中注意到了一些标题的痛苦
Flex 对 REST 的支持充其量是很弱的。我花了很多时间构建原型,所以我知道大部分问题。如前所述,开箱即用仅支持 GET 和 POST。乍一看,您似乎可以使用 LiveCycle Data Services 或 Blaze 中的代理配置来获得对 PUT 和 DELETE 的支持。然而,它是一个骗局。来自您的 Flex 应用程序的请求仍将是 POST。代理将其转换为服务器端的 PUT 或 DELETE 以欺骗您的服务器端代码。还有其他问题。听说这是 Adobe 所能想到的最好的方案。经过我的评估,我们决定朝另一个方向发展。
我现在正在开发一个严重依赖于 Flex 和 JavaScript 以及 Java Servlet 之间的 REST 调用的应用程序。我们通过建立一个在错误时返回的 <status id="XXX" name="YYYYYY"> 块的约定来解决响应错误代码问题,错误 ID 大致映射到 HTTP 错误代码。
我们通过使用 Java Servlet 作为 HTTP 代理解决了跨站点脚本的限制。对代理的调用(它在为其余内容(包括 Flex 内容)提供服务的同一台服务器上运行,将请求发送到另一台服务器,然后将响应发送回原始调用者。
RestfulX解决了 Flex 的大部分/所有 REST 问题。它支持 Rails/GAE/Merb/CouchDB/AIR/WebKit,我相信将它连接到您的 Java 实现会很容易。
Dima 也将 AS3HTTPClient 库集成到其中。
看看这个!
实际上已经在使用带有 Rest-Style 框架的 Flex。正如 mbrevort 已经提到的那样,不能直接使用 PUT 和 DELETE 方法。相反,我们通过 POST 进行 PUT,而对于 DELETE,我们在具有 URL 参数(如 ?action=delete)的资源上使用 GET。
这不是 100% Rest 风格,所以我不确定这是否适用于 JSR 311 实现。您将需要服务器端的一些灵活性来解决 PUT 和 DELETE 限制。
关于错误处理,我们实现了错误服务。如果发生服务器端错误,Flex 应用程序可以查询此错误服务以获取实际的错误消息。这也比仅仅将 HTTP 返回码映射到静态消息灵活得多。
然而,感谢 Flex 的 ECMA 脚本,使用基于 XML 的 REST 服务非常容易。
REST 更像是一种意识形态。你去 REST 演示,他们有coolaide 分配器。
对于 Flex 应用程序,结合 BlazeDS 和 AMF 数据编组滚动堆栈更方便且性能更高。
我过去管理这个的方法是利用一个 PHP 代理来处理远程 Web 服务调用并将 RTU JSON 返回给客户端..
可能是新的 flex 4 是答案http://labs.adobe.com/technologies/flex4sdk/
《Flexible Rails 》一书可能会有所帮助——它是关于如何将 Flex 用作 RESTful 客户端的极好资源。尽管它侧重于将 Flex 与 Rails 框架结合使用,但我相信这些概念适用于任何 RESTful 框架。我使用这本书来快速了解如何将 Flex 与 REST 结合使用。
我为富兰克林柯维做一个大型的弹性项目。我们使用 REST 服务。为了支持这一点。我们创建了一个 XMLHttpRequest 包装器。通过使用带有一些事件处理程序的外部接口。我们开源了这个库。您可以在https://github.com/FranklinCovey/AS3-XMLHttpRequest查看它