是否可以使用Flex创建REST客户端?

时间:2008-09-30 14:56:41

标签: java flex rest

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

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

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

15 个答案:

答案 0 :(得分:23)

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

Jorge Rasillo和Mike Burr的这个IBM Developer Works article from August 2008展示了如何构建Flex前端/ REST后端应用程序(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,并且是一个已经存在了一段时间的解决方法。这是一个片段,但还有更多的讨论。

  

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

我对此的看法是,如果您的Web端支持此X-Method-Override标头,那么您可以使用此方法。 Don Box评论让我觉得它得到了相当好的支持,但我还没有确认。

另一个问题是能够读取HTTP响应头。同样,从a blog post in 2007 by Nathan de Vries开始,我们看到了这一点。他通过自己的评论跟进了博客文章和讨论:

  

“网络方面的唯一变化是Flash Player的新版本(当然是随Flex 3 beta提供的版本)现在支持HTTPStatusEvent实例的responseHeaders属性。”

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

答案 1 :(得分:6)

正如许多人所指出的那样HTTPService有点简单,并没有做你想做的所有事情。但是,HTTPService只是flash.net.*类之上的URLLoaderURLRequestURLRequestHeader和{{1}}。使用这些可以组合大多数HTTP请求。

当支持除GET和POST之外的其他方法时,问题主要在于某些浏览器(例如Safari)不支持这些,并且Flash Player依赖于浏览器进行所有网络连接。

答案 2 :(得分:5)

Flex有能力充当纯REST客户端的明显缺点。

以下评论来自此blog

  

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

     
      
  1. 开箱即可支持GET和POST方法(除非您   使用FDS并将useProxy属性设置为   真)
  2.   
  3. 无法设置请求标头,也无法访问响应   头。因此我无法做到   访问案例中的响应正文   一个错误。
  4.   
  5. 它认为HTTPService获取其他任何200的状态代码   一个错误。 (事件201,哎!!)。该   FaultEvent不提供信息   关于状态代码的任何响应   身体。 Flex客户端没有   想法出了什么问题。
  6.   

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

是否可行取决于您愿意通过代理等方式解决的问题。

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

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

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

我在http://verveguy.blogspot.com/2008/07/truth-about-flex-httpservice.html

的旧博文中注意到一些标题很痛苦

答案 5 :(得分:2)

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

答案 6 :(得分:1)

是的,我能够在此组件中使用POST和访问标头:

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

Example

答案 7 :(得分:1)

我现在正在开发一个依赖于Flex和JavaScript以及Java Servlet之间的REST调用的应用程序。我们通过建立< status id =“XXX”name =“YYYYYY”>的约定来解决响应错误代码问题。错误时返回的块,错误ID大致映射到HTTP错误代码。

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

答案 8 :(得分:1)

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

Dima还将AS3HTTPClient库集成到其中。

看看吧!

答案 9 :(得分:0)

实际上已经在使用Flex和Rest-Style Framework了。由于mbrevort已经提到PUT和DELETE方法不能直接使用。相反,我们通过POST进行PUT,对于DELETE,我们在资源上使用GET,其URL参数类似于?action = delete。

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

关于错误处理,我们实现了错误服务。如果出现服务器端错误,Flex应用程序可以查询此错误服务以获取实际错误消息。这比将HTTP返回代码映射到静态消息更灵活。

但是,感谢ECMA使用基于XML的REST服务的Flex脚本编写非常容易。

答案 10 :(得分:0)

REST更像是一种意识形态而非任何东西。你去REST演示,他们有coolaide掌柜。

对于Flex应用程序,将堆栈与BlazeDS和AMF数据编组一起滚动更方便,性能更高。

答案 11 :(得分:0)

我过去管理这种方式的方法是利用处理远程Web服务调用的PHP代理并将RTU JSON返回给客户端。

答案 12 :(得分:0)

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

答案 13 :(得分:0)

本书Flexible Rails可能会有所帮助 - 它是如何将Flex用作RESTful客户端的绝佳资源。虽然它专注于将Flex与Rails框架一起使用,但我相信这些概念适用于任何RESTful框架。我使用本书快速了解使用Flex with REST。

答案 14 :(得分:0)

我为Franklin Covey开展了一个大型的灵活项目。我们使用REST服务。为了支持这一点。我们创建了一个XMLHttpRequest包装器。通过使用外部接口与一些事件处理程序。我们开源了图书馆。您可以在https://github.com/FranklinCovey/AS3-XMLHttpRequest

查看