ruby-on-rails-3 - 单独的REST JSon APi服务器和客户端?

  显示原文与译文双语对照的内容

我正要从头开始创建一批网络应用程序。 ( 参见 http://50pop.com/code 。) 我希望它们能够从许多不同的客户端访问: front-end网站,智能手机应用,后端 web webservices,等等 所以我真的想要一个 JSON REST API 。

另外,我更喜欢从事的back-end,所以我的遐想,我保持我的重点只关注该 API,并雇用别人来使front-end用户界面,无论在网站,iPhone,Android,或者其他应用程序。

请帮助我决定我应该采取哪种方法:

在 Rails 中一起使用

制作一个非常标准的Rails web-app 。 在控制器中,执行 respond_with switch,以提供JSON或者 HTML 。 JSON响应就是我的API 。

大量先例。 很好的标准&这样做的许多例子。

不一定是希望应用编程接口被无法弥补与网络应用程序相同。 不喜欢/然后 respond_with switch 方法。 混合两个截然不同的东西( 用户界面+ API ) 。

REST服务器+ JAVASCRIPT-HEAVY客户端

创建一个 JSON-only REST API 服务器。 使用 Backbone 或者 Ember.js client-side JavaScript直接访问 API,在浏览器中显示模板。

我喜欢分离 API &客户端。 聪明的人说这是个方法。 理论上很好,似乎是前沿和令人兴奋的。

Con: 没有多少先例。 没有这么多的例子。 公共示例 (twitter.com) 感到&的甚至都在从这个方法切换。

REST服务器+ SERVER-SIDE HTML客户端

创建一个 JSON-only REST API 服务器。 创建一个基本的HTML网站客户端,只访问 REST API 。 更少的client-side JavaScript 。

我喜欢分离 API &客户端。 但是使用普通的HTML5是非常简单的&不是 client-intensive 。

Con: 没有多少先例。 没有这么多的例子。 框架也不支持这一点。 不确定如何处理它。

尤其是寻找来自经验的建议,而不仅仅是 in-theory 。

时间:

无限的,我们已经深入了选项 #2,并将它滚动到了成千上万的学生。 我们的服务器是一个 JSON REST API ( Scala + MongoDB ),我们的所有客户端代码都直接从 CloudFront ( IE: www.boundless.com 只是CloudFront的别名。

优势:

  • 尖端/激动人心
  • 你的钱有很多爆炸: API为你自己的网络客户端,移动客户端,3 rd参与方访问等提供基础。
  • 快速站点加载/页面转换

缺点:

  • 没有搜索引擎优化友好/准备没有更多工作。
  • 需要top-notch站点front-end的人谁准备应付w/现实的站点体验是 70% javascript,这意味着。

我认为这就是所有web-apps的未来。

对web前端用户( 所有 new-ness/挑战都在这个架构中)的一些想法:

  • 生成高质量代码更容易。
  • Backbone 。组织逻辑和活跃社区的好方法。
  • HAMLC 。Haml + CoffeeScript模板=> JS 。
  • SASS

我们已经为我们的front-end开发构建了一个叫做'spar'( 单页面应用程序 Rocketship )的工具,它是从 Rails 调优到单一页面应用开发的资产管道。 中有更detail,我们将在接下来的几个星期,在我们内 open-sourcing gitub 页面,以及一篇博客文章解释如何使用它和整体递阶

更新:

关于 Backbone的人们的关注,我认为他们是 over-rated 。 Backbone 是一个组织原则,而不是一个深层框架。 Twitter 站点本身是一个巨大的Javascript,涵盖了数百万用户的所有 corner-case &,同时加载了 tweets,垃圾收集,显示了大量的'纯'js站点,Twitter,等等,等等。 通过JS提供了许多令人印象深刻的复杂应用。

你对架构的选择完全取决于你的目标。 如果你正在寻找支持多个客户的最快方法,并且拥有良好的front-end天赋,那么在独立的API中投资是一个不错的方法。

很好的问。+1,这对我来说是未来有用的参考。 同时 @Aaron 和其他人也在讨论中增加了价值。 ruby 一样,这个问题同样适用于其他编程环境。

我使用了前两个选项。 第一个用于多个应用程序,第二个用于我的开源项目 Cowoop

选项 1

这无疑是最流行的一种。 但我发现实现非常 http-ish 。 每个初始的api代码都在处理请求对象。 所以API代码不仅仅是纯 ruby/python/other 语言代码。

选项 2

我一直喜欢这个。

这里选项也意味着HTML不是在服务器上生成的运行时。 选项 2与选项 3不同。 但是构建使用构建脚本作为静态 html 。 在客户端加载时,这些HTML将调用API服务器作为 JS API客户端。

  • 关注点分离是一个巨大的优势。 和你非常喜欢( 和我的) 后端专家实现后端api一样,他们很容易就像平常的语言代码一样测试它们,而不用担心框架/http请求代码。

  • 这并不像前端的声音那么困难。 执行API调用和结果数据( 多数 json ) 可以用于你的客户端模板或者 MVC 。

  • 更少的服务器端处理。这意味着你可以使用商用硬件/更便宜的服务器。

  • 独立地测试层,更容易生成API文档。

它确实有一些缺点。

  • 许多开发人员在工程上发现这一点并难以理解。 所以架构可能会受到批评。

  • i18n/l10n很困难。因为HTML本质上是生成时间是静态的,所以需要每个支持的语言( 这并不是什么坏事) 构建多个版本。 但即使那时的l10n/i18n 周围你可能有边缘问题和需要小心。

选项 3

这种情况下的后端编码必须与第二个选项相同。 选项 2的大多数点在这里也适用。

使用服务器端模板在运行时呈现网页。 这使得 i18n/l10n更易于使用/接受的技术。 可能是少了一个http调用渲染,如用户,对于某些所需的基本上下文页面里,货币 等等 所以服务器端处理是进行渲染的增加,但可能是由更少的http调用API服务器时补偿。

现在页面是服务器上呈现的服务器,前端现在更符合编程环境。 对于许多应用程序,这可能不是一个考虑因素。

Twitter 案例

就像我所理解的,Twitter 可能在服务器上进行初始页面呈现,但是对于页面更新它仍然有一些API调用和客户端模板来处理 DOM 。 所以在这种情况下,你有两个模板来维护一些开销和复杂性。 不是每个人都能负担这个选项,不像 Twitter 。

我们的项目堆栈

我碰巧使用 python 。 我使用 JsonRPC 2.0而不是 REST 。 我建议 REST,尽管我喜欢JsonRPC的各种原因。 我在下面的库中使用。考虑 2/3的人可能会觉得有用。

我的结论和建议

选项 3 。

全部说,我已经成功地使用了选项 2,但现在正在向选项 3倾斜一些简单。 使用构建脚本生成静态HTML页面并为它的提供一个专门用于服务静态页面的超快速服务器,这非常诱人。

我们选择使用 #2 编制 gaug.es. 时我一直对 API ( ruby,Sinatra,等等 ) 和我的业务伙伴,史蒂夫·史密斯,在从事了 front-end ( javascript客户端) 。

优势:

  1. 快速移动。如果我在Steve面前工作,我可以继续为新特性创建 api 。 如果他在我面前工作,他就可以很容易地伪装出API并构建用户界面。

  2. 免费的API 。对应用程序中数据的开放访问很快就成为一个标准特性。 如果你从底层开始使用 API,你可以免费获得。

  3. 干净的分离。最好把你的应用看作一个带有客户的API 。 当然,第一个和最重要的客户端可能是一个站点,但是它将你设置为轻松创建其他客户端( iPhone,安卓) 。

缺点:

  1. 更比你的直接的问题,但是一旦你与一个API相关的API的向后兼容性。这是。你不可以破坏它,否则将破坏你的客户都找不到她了两个。 这并不意味着你必须放慢速度,但这意味着你必须经常做两件事工作。 添加到API或者新字段是很好的,但不应该在没有版本控制的情况下更改/删除。

现在我不能再考虑了。

结论:如果你打算发布一个 API,那么 API + JS客户端就是你要去的方式。

P.S 。我还建议你在发布之前完全记录你的API 。 记录 Gaug.es API的过程真的帮助了我们

http://get.gaug.es/documentation/api/

我喜欢走 #2 和 #3.的路线 主要是因为 #1 违反了关注点和intermingles的分离。 最终你会发现有一个API结束点没有匹配的HTML页面/等等,你将在同一个代码库中使用混合的HTML和JSON端点。 ,就会变成变成个乱糟糟的,即使它的MVP,你将不得不re-write它最终甚至因为它的汽车需凌乱,他不是值得打捞。

使用 #2 或者 #3,你可以完全拥有一个充当相同( 在大多数情况下)的API 。 在这里提供了极大的灵活性。我不是 Backbone/ember/whatever/etc.js 只是 yet, 100%卖掉, 我认为它很棒,但就像我们在 Twitter 中看到的,这不是最优的。 但是。。Twitter 也是一家巨大的公司,拥有数以亿计的用户。 因此任何改进都会对各种业务单位的不同领域产生巨大的影响。 我认为决策比速度更多,他们并不让我们进入。 但这只是我的观点。 但是,我不折扣 Backbone 及其竞争对手。 这些应用非常好用,而且非常干净,而且响应速度非常快。

第三个选项也有一些有效的吸引力。 这是在哪我就会顺着你的主要标记( 反之亦然)的帕累托原理( 80/20 规则) 和有 20%在服务器上呈现,然后有一个很好的JS客户端( Backbone/etc ) 运行其它的呢。 你可能无法在通过jsp页面 REST API 100%与客户端通信,但你如有必要还会做一些工作来提高suer使用体验更好。

我认为这是"这取决于"类型的问题之一,答案是"这取决于",你正在做什么,你是谁,你想让他们接受什么样的经验。 假设你可以在 2或者 3之间或者二者混合。

我目前正在努力将一个巨大的CMS从选项 1转换到选项 3,它运行良好。 我们选择渲染标记 server-side,因为SEO对我们来说很重要,而且我们希望网站能在手机上表现良好。

我正在使用 node.js 作为客户端的back-end,并使用一些模块来帮助我。 我在某种程度上在过程的早期但创办人已经设置,就是如何编写都使用的数据确保服务器所有呈现正确的。 下面是我使用的内容:

  • 为应用打下基础。
    (https://github.com/visionmedia/express)
  • 获取数据的请求。
    (https://github.com/mikeal/request)
  • 获得渲染服务器端端的下划线模板。 我在客户端重用这些。
    (https://github.com/documentcloud/underscore)
  • UTML包装下划线的模板,使它的与Express一起工作。
    (https://github.com/mikefrey/utml)
  • Upfront收集模板并让我们选择发送给客户的模板。
    (https://github.com/mrDarcyMurphy/upfront)
  • Express公开将获取的数据,部分模块和模板传递给 front-end 。
    (https://github.com/visionmedia/express-expose)
  • Backbone 在吞下传递的数据后在front-end上创建模型和视图。
    (https://github.com/documentcloud/backbone)

这是堆栈的核心。 我发现一些其他模块有帮助:

  • 斑点 (https//github.com/trek/fleck)
  • 力矩 (https//github.com/timrwood/moment)
  • 手写笔 (https//github.com/LearnBoost/stylus)
  • smoosh (https//github.com/fat/smoosh)
    虽然我正在寻找 grunt (https//github.com/cowboy/grunt)
  • 控制台跟踪 (//github.com/LearnBoost/console-trace).

否,我没有使用 coffeescript 。

这个选项非常适合我。 back-end上的模型是non-existant的,因为我们从API获得的数据是结构化的,我将它逐字地传给 front-end 。 唯一的例外是我们的布局模型,在这里我添加了一个单独的属性,使渲染更加智能和轻松。 我没有使用任何模型库,只是一个函数,它添加了我在初始化时需要的东西并返回自己。

( 抱歉,奇怪的链接,我太多n00b的堆栈溢出,让我张贴这么多)

我通常使用 2的选项,使用 Rails 构建 API,并使用 Backbone 作为JS内容。 你甚至可以使用 ActiveAdmin编辑器免费获得一个管理面板。 我已经用这种后端交付了几十个移动应用。 然而,它严重取决于你的应用是否是交互式的。

我在最后一个 RubyDay.it 上对这种方法进行了演示: http://www.slideshare.net/matteocollina/enter-the-app-era-with-ruby-on-rails-rubyday

对于第三个选项,为了获得 2秒的响应能力,你可能想要尝试 pajax 作为 Github 。

我们使用以下 #3: 变体 创建一个 JSON-only REST API 服务器。 创建一个HTML网站服务器。 你的变体一样,HTML网络服务器不是 REST API 服务器的客户端。 相反,两者是对等点。 在表面不远的地方,有一个内部 API,它提供了两个服务器需要的功能。

我们没有发现任何先例,所以它是实验性的。 到目前为止,( 即将进入测试版) 已经很好地解决了。

我是大约成 3 2月月项目,采用第二种方法你已经概述了这。 我们在前端使用一个 RESTful API服务器端和 backbone.js 。 Handlebars.js 管理模板和jQuery处理AJAX和DOM操作。 对于旧的浏览器和搜索蜘蛛,我们已经回到服务器端的渲染,但是我们使用的是与Rhino相同的HTML模板。

在较宽的范围内yet,保守我们选择这种方法由于许多不同的原因,但都很注意它是有一点儿危险性还没有 proven. 一切都一样,现在一切都非常顺利。

到目前为止,我们一直在使用一个 API,但是在这个项目的下一个阶段,我们将使用第二个 API 。 第一个是针对大量数据,第二个是通过API更像一个 CMS 。

在选择这个基础设施时,让这两个项目相互独立是一个关键的考虑。 如果你正在寻找一个架构来混合不同的独立资源而不依赖任何依赖,那么这是值得的。

恐怕我不是一个 ruby 人,所以我不能对其他方法进行评论。 有时候冒险是可以的。 其他时候最好是安全播放。 根据项目类型,你将拥有自己。

在这里选择你的最佳选择。 渴望看到其他人分享的内容。

我喜欢 #3 当我的网站不是我的数据的100% CRUD实现时。 这还没有发生。

我喜欢 Sinatra,只是把应用分成几个不同的不同的机架应用。 我将制作一个API特定的机架应用,它将涵盖我所需要的API 。 然后可能会有一个用户机架应用来展示我的网页。 有时候该版本会在需要时查询 API,但通常它只关注html站点。

我不用担心它,只要我需要,就从用户端做一个持久层查询。 我并不是过度关注创建完全的分离,因为它们最终会为不同的目的提供服务。

下面是一个使用多个机架应用的的简单例子。 我在那里添加了一个快速的jquery示例,让你看到它点击API应用程序。 你可以看到,使用不同的目的,Sinatra 和挂载多个机架应用是多么简单。

https://github.com/dusty/multi-rack-app-app

这里有一些很棒的答案- 我肯定推荐 #2 或者 #3 - 分离是很好的概念,但在实践中也是如此。

它可以很难预测如原料药上的负载和流量模式和客户等方面我们看到服务等的应用编程接口有一个更简单的时间独立地的供应和缩放。 如果你要用人类网站访问模式来转换,那么就不容易了。 还你的API用法最后可能会按比例增大比你的网络客户端,然后你会看到在哪里直接更快地执行这里任务。

#2 之间 #3的一切都取决于你的目标- 我都觉得 #2 可能是 web apps,但是或许你想要一些更直截了当的未来如果那个频道是唯一将是下面的其中一个 !

...