我正在计划一个新的应用程序,并一直在尝试使用GWT作为可能的前端。我面临的设计问题是这个。
我应该使用吗? 选项A:GWT-RPC并快速构建应用程序
选项B:使用Spring MVC 3.0和所有优秀的@Controller,@ Service,@ Repository注释构建REST后端,并使用GWT覆盖功能和GWT请求构建器构建客户端库以与后端通信吗? / p>
我对这种设计的所有优点和缺点以及人们的经验感兴趣?
答案 0 :(得分:28)
问自己一个问题:“我是否需要重用非GWT前端的服务器端接口?”
如果答案是“否,我将只有一个GWT客户端”:您可以使用GWT-RPC,并利用您可以在两者上使用Java对象的事实服务器和客户端。这也可以使通信更有效,至少与<inherits name="com.google.gwt.user.RemoteServiceObfuscateTypeNames" />
一起使用时,会将类型名称缩短为小数值。您还将获得更好的错误处理(使用异常),类型安全等等的优势。
如果答案是“是的,我将使我的服务可以访问多种前端”:您可以使用REST与JSON(或XML),这也可以通过非GWT客户。除了切换客户端之外,这还可以让您在将来更轻松地切换到不同的服务器实现(可能是非Java)。缺点是,您可能必须在GWT客户端编写包装器(JavaScript Overlay Types)或转换代码,以便从JSON对象构建漂亮的Java对象。部署新版本的服务时,您必须特别小心,这使我们回到缺乏类型安全性。
第三种选择当然是建立两者。如果公共REST接口应该与GWT-RPC接口不同,我会选择这个选项 - 可能只提供一小部分易于使用的服务。
答案 1 :(得分:25)
如果同时使用RestyGWT项目,您可以同时执行这两项操作。它将使基于REST的JSON资源调用与使用GWT-RPC一样简单。另外,您通常可以从客户端的服务器端重用相同的请求响应DTO。
答案 2 :(得分:9)
我们在创建Spiffy UI Framework时遇到了同样的问题。我们选择了REST,我永远不会回去。我甚至说GWT-RPC是GWT Anti-pattern。
即使您从未打算公开您的REST端点,REST也是一个好主意。创建REST API将使您的UI更快,您的API更好,整个应用程序更易于维护。
答案 3 :(得分:3)
我想说构建一个REST后端。在我上一个项目中,我们开始使用GWT-RPC开发前几个月,我们想要快速启动。稍后,当我们需要REST API时,进行重构是非常昂贵的,我们最终得到了两个后端API(REST和RPC)
如果你在客户端建立一个合适的REST后端和反序列化(将json \ xml转换为GWT Java对象),那么RPC的好处几乎没有。
REST方法的另一个有时被遗忘的优点是运行客户端的浏览器更自然,RPC是一种支持协议,其中所有请求都使用POST。在以标准方式读取资源时,您可以从客户端缓存中受益。
回答ams评论 关于RPC协议,上次我使用firebug“嗅”它,它看起来不像json,所以我不知道。虽然,即使它是基于json的,它仍然只使用HTTP POST方法与服务器通信,所以我在这里关于缓存的观点仍然有效,浏览器不会缓存POST请求。
关于回顾以及可以做得更好的事情,在面向资源的体系结构中编写RPC服务可能会导致以后更容易移植到REST。请记住,在REST中,通常会使用基本的CRUD操作公开资源,如果您在编写RPC服务时专注于该方法,那么您应该没问题。
答案 4 :(得分:3)
REST架构风格通过按需代码促进可检查消息(有助于调试和安全性),API演进,多平台,简单接口,故障恢复,高可伸缩性和(可选)可扩展系统。它交换每个交互性能以实现整体网络效率。它减少了服务器对一致应用程序行为的控制。
“RPC风格”(正如我们所说的那样与REST相对)促进了平台的一致性,界面可变性,代码生成(从而无法假装网络的能力,但请参阅Fallacies ),以及定制的互动。它可以实现整体网络效率,实现高交互性能。它增加了服务器对一致应用程序行为的控制。
如果您的应用程序需要以前的品质,请使用REST样式。如果它需要后者,请使用RPC样式。
答案 5 :(得分:1)
如果您计划在服务器端使用Hibernate / JPA并将生成的POJO及其中的关系数据发送到客户端(即带有电话集合的Employee对象) ,一定要使用REST实现。
我在一个月前使用GWT RPC开始了我的GWT项目。一切顺利,直到我尝试从底层数据库中序列化一个具有一对多关系的对象。并得到了可怕的:
com.google.gwt.user.client.rpc.SerializationException: Type 'org.hibernate.collection.PersistentList' was not included in the set of types which can be serialized by this SerializationPolicy
如果遇到这种情况并希望继续使用GWT RPC,则必须使用以下内容:
我现在正在使用RestyGWT。转换相当轻松,我的POJO序列化没有问题。
答案 6 :(得分:0)
我想说这取决于整个申请的范围。如果您的后端应该被其他客户端使用,则需要可扩展等,然后使用REST创建一个单独的模块。如果后端仅由此客户端使用,则转到GWT-RPC解决方案。