【问题标题】:Is REST a good choice for GUI web applications?REST 是 GUI Web 应用程序的好选择吗?
【发布时间】:2010-02-03 07:14:50
【问题描述】:

基于 GUI 的 Web 应用程序可以构建在 GUI 组件、有状态框架(如 Wicket)上,或者它们可以以 RESTful、无状态方式构建,GUI 状态仅在客户端上。

从技术角度来看,REST 看起来是正确的方法,因为它充分利用了 http 的强大功能并导致了高度可扩展的应用程序。但这是有代价的。在许多情况下,复杂的 GUI 需要客户端上的 JavaScript 应用程序。如果应在客户端上维护状态,您必须留在同一页面上并仅重新加载部分。或者你必须使用隐藏 iframe 的技巧。有时服务器上有购物车之类的伪资源,以启用 RESTful 设计。你必须保持多步对话的中间状态等等......

如果我环顾四周,很少有 RESTful GUI Web 应用程序。这是因为历史原因还是 RESTful 设计在常见场景中效率低下?

【问题讨论】:

  • 您对“GUI Web 应用程序”的定义是什么?雅虎网?堆栈溢出?谷歌地图? eyeos.org?
  • 或者把@deceze的评论转过来:什么时候不是GUI?
  • GUI 是与人类直接交互的应用程序,而服务是机器对机器通信的一侧。
  • 那么...网页呢?如果它 [大部分] 是静态的,还是需要“做某事”,它是否算数?

标签: rest wicket web-frameworks


【解决方案1】:

如果我环顾四周,发现很少 RESTful GUI Web 应用程序。这是 因为历史原因或者是 RESTful 设计没有共同点 场景?

我的回答是主观的,但在我看来,有两个主要障碍阻碍了 RESTful 的开发:

  1. 变化 - 它与网站的传统设计方式截然不同
  2. 挑战 - 设计一个纯 RESTful 服务器 API 和相应的丰富、强大的客户端 UI 并不容易

复杂的 GUI 需要 JavaScript 在许多客户端上的应用程序 案例。

在我看来,无论服务器端实现如何,复杂、丰富的客户端体验都需要一些深入的 JavaScript。

您必须保持在同一页面上并且 仅重新加载零件,

这是一种与传统的请求/响应整页到整页设计截然不同的设计。每种设计都有自己的权衡取舍。 REST 设计特别适用于 AJAX 调用,但客户端代码需要仔细设计才能维护和健壮。

带有胖客户端的 RESTful 服务器:

  • 可扩展性良好:每个用户的会话信息不会存储在稀缺的服务器内存中
  • 通过网络减少请求/响应数据:不完整发送每个页面,不发送会话 ID 或 ViewStates
  • 干净的可重用 URL:提供一个干净、解耦的服务器 API,可以支持多个 UI
  • pure:严格遵守 HTTP 规范(GET 不会产生副作用等)
  • 客户体验:异步事务更丰富、响应更快

但是,正如您提到的,胖客户端也有缺点:

  • 更容易受到 XSS 攻击,RESTful URL 确实需要小心的安全性
  • 复杂的 JavaScript 可能难以开发、维护和调试(使用 OO JavaScript 可以帮助解决这个问题)
  • 需要向用户表明异步请求正在后台处理
  • 需要更多的客户端故障处理逻辑
  • 与服务器端相比,框架和 IDE 工具在客户端开发方面一直较弱(这正在慢慢变得更好)

【讨论】:

    【解决方案2】:

    RESTful GUI 设计非常高效,恕我直言。您可以利用许多功能而无需额外工作来支持极端情况,例如用户重新提交信息、浏览器历史记录(后退和前进)多个选项卡和窗口。如果我没记错的话,这个网站使用的是 RESTful UI。

    【讨论】:

      【解决方案3】:

      REST 是通过观察成功的 Web 应用程序(GUI 和 M2M)的特征来定义的。因此,根据定义,它应该适用于这些情况。

      我还注意到你问了一个关于 desktop versus web applications 的问题。您可能有兴趣知道 REST 也是构建桌面客户端应用程序的出色架构。我编写了一些桌面客户端,它们从 REST 服务器获取所有数据。

      【讨论】:

      • 我可以想象 REST 是桌面应用程序的一个很好的后端,但是在这样的应用程序中管理状态很容易。而今天浏览器中的状态管理并非易事。 (PS:我没有问提到的问题)
      • 抱歉,我把你和 Dimitre 搞混了。
      猜你喜欢
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 2013-07-02
      • 2017-07-26
      • 2023-03-12
      • 2011-01-02
      相关资源
      最近更新 更多