用Flex创建REST客户端是否可行?
我正在使用使用Java实现的Restful架构(使用新的JAX-RS标准)开始一个项目。
我们计划使用Flex应用程序开发GUI。我已经发现使用HTTPService组件实现此问题(响应错误代码,标头访问...)。
你们中的任何一个在类似项目中都有一些经验。可行吗
解决方案
Flex充当纯RESTful客户端的功能存在某些缺点。
以下评论来自此博客:
The problem is HTTPService class has several major limitations: Only GET and POST methods are supported out of the box (unless you use FDS and set useProxy attribute to true) Not able to set request headers and there is no access to response headers. Therefore I am not able to access the response body in the case of an error. It HTTPService gets a status code anything other 200, it consider an error. (event 201, ouch!!). The FaultEvent doesn’t provide information about the status code any response body. The Flex client will have no idea what went wrong.
Matt Raible还通过Rails,Grails,GWT和Flex很好地介绍了REST,并提供了一些很好的参考。
它是否可行,实际上取决于我们愿意通过代理解决的工作量,等等。
实际上,已经在将Flex与Rest-Style框架一起使用。正如mbrevort已经提到的那样,不能直接使用PUT和DELETE方法。取而代之的是,我们通过POST进行PUT,对于DELETE,我们在具有URL参数(如?action = delete)的资源上使用GET。
这不是100%Rest风格,所以我不确定是否可以与JSR 311实现一起使用。我们将需要在服务器端具有一定的灵活性,以解决PUT和DELETE限制。
关于错误处理,我们已经实施了错误服务。如果发生服务器端错误,Flex应用程序可以查询该错误服务以获取实际的错误消息。这不仅比将HTTP返回码映射到静态消息要灵活得多。
但是,由于有了ECMA的Flex脚本,使用基于XML的REST服务的脚本非常容易。
是的,我能够对此组件使用POST和访问标头:
http://code.google.com/p/as3httpclient/wiki/链接
例子
我现在正在开发一个严重依赖Flex和JavaScript与Java Servlet之间的REST调用的应用程序。我们通过建立<status id =" XXX" name =" YYYYYY">块的约定来解决响应错误代码问题,该约定在发生错误时返回,错误ID大致映射到HTTP错误代码。
通过使用Java Servlet作为HTTP代理,我们可以解决跨站点脚本的局限性。调用代理(该代理在提供其余内容(包括Flex内容)的同一台服务器上运行,将请求发送到另一台服务器,然后将响应发送回原始调用者。
正如许多人指出的那样,HTTPService
有点简单,不能完成我们想做的所有事情。但是,HTTPService只是在flash.net。*类(如URLLoader,URLRequest和URLRequestHeader)之上的糖。使用这些,我们可以组装大多数HTTP请求。
在支持除GET和POST之外的其他方法时,问题主要在于某些浏览器(例如Safari)不支持这些方法,而Flash Player依赖于浏览器来实现其所有联网。
这里的问题是,围绕此问题的许多网络讨论都已经有一年或者更久的历史了。我现在正在做同样的研究,这就是我今天所学到的。
Jorge Rasillo和Mike Burr于2008年8月发表的这篇IBM Developer Works文章展示了如何制作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。
因此,我进一步进行了挖掘,并与Don Box(最初的SOAP专家之一)找到了这篇帖子并进行了讨论。显然,这是一个相当标准的行为,因为某些浏览器等不支持PUT和DELETE,并且已经存在了很长时间。这是一个片段,但还有更多讨论。
"If I were building a GData client, I honestly wonder why I'd bother using DELETE and PUT methods at all given that X-HTTP-Method-Override is going to work in more cases/deployments."
我可以避免的是,如果Web端支持此X-Method-Override标头,则可以使用此方法。 Don Box的评论使我认为它得到了很好的支持,但是我还没有证实这一点。
关于能够读取HTTP响应标头的另一个问题。同样,从Nathan de Vries在2007年发表的博客文章中,我们看到了讨论的内容。他通过自己的评论跟进了该博客文章和讨论:
"The only change on the web front is that newer versions of the Flash Player (certainly those supplied with the Flex 3 beta) now support the responseHeaders property on instances of HTTPStatusEvent."
我希望这现在不是问题。
REST更是一种意识形态。我们去REST演示,他们有coolaide分配器。
对于Flex应用程序,将堆栈与BlazeDS和AMF数据编组一起滚动会更方便,更高效。
我过去处理此问题的方式是利用PHP代理处理远程Web服务调用,并将RTU JSON返回给客户端。
我一直在致力于完全支持REST的HTTPService组件的开源替代。如果感兴趣,可以在此处找到beta版本(源代码和/或者已编译的Flex共享运行时库)和说明:
http://code.google.com/p/resthttpservice/
可能是新的flex 4就是答案http://labs.adobe.com/technologies/flex4sdk/
RestfulX已使用Flex解决了大多数/所有REST问题。它具有对Rails / GAE / Merb / CouchDB / AIR / WebKit的支持,而且我敢肯定,将其连接到Java实现非常方便。
Dima也将AS3HTTPClient库集成到其中。
一探究竟!
简短的答案是,我们可以使用Flex进行RESTful。我们只需要解决Flash播放器的限制(最好使用最新版本)以及所包含的浏览器的HTTP堆栈限制。
在解决了基本的HTTP请求标头以及通过rails-esque?_method =方法缺少PUT和DELETE之后,我们已经在Flex中进行RESTful客户端开发超过一年了。也许有些俗气,但可以完成工作。
我在http://verveguy.blogspot.com/2008/07/truth-about-flex-httpservice.html上的旧博客文章中指出了一些标头的痛苦
《 Flexible Rails》一书可能会有所帮助-这是有关如何将Flex用作RESTful客户端的绝佳资源。尽管它侧重于将Flex与Rails框架一起使用,但我相信这些概念适用于任何RESTful框架。我使用本书来快速掌握将Flex与REST结合使用的方法。
对REST的Flex支持充其量是弱的。我花了很多时间来制作原型,所以我知道大多数问题。如前所述,开箱即用仅支持GET和POST。乍一看,我们可以使用LiveCycle Data Services或者Blaze中的代理配置来获得对PUT和DELETE的支持。但是,这是一个假的。来自Flex应用程序的请求仍然是POST。代理在服务器端将其转换为PUT或者DELETE,以欺骗服务器端代码。还有其他问题。听说这是Adobe可以提供的最好的解决方案。经过我的评估,我们决定朝另一个方向发展。