单独的REST JSON API服务器和客户端?

我即将从头开始创建一系列网络应用程序。 (请参阅http://50pop.com/code的概述。)我希望他们能够从许多不同的客户端访问:前端网站,智能手机应用程序,后端Web服务等。所以我真的很想每个JSON REST API。

另外,我更喜欢在后端工作,所以我做了白日梦,将我的注意力全部集中在API上,并雇用其他人来制作前端UI,无论是网站,iPhone,Android还是其他应用。

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

在轨道上

制作一个非常标准的Rails网络应用程序。 在控制器中,执行respond_with开关,以提供JSON或HTML。 JSON响应是我的API。

Pro:很多先例。 伟大的标准和许多以这种方式做事的例子。

Con:不一定希望API与Web应用程序相同。 不喜欢if / thenresponse_with切换方法。 混合两种截然不同的东西(UI + API)。

REST SERVER + JAVASCRIPT-HEAVY客户端

制作仅JSON的REST API服务器。 使用Backbone或Ember.js用于客户端JavaScript,直接访问API,在浏览器中显示模板。

Pro:我喜欢API和客户端的分离。 聪明的人说这是要走的路。 理论上很好。 似乎前沿和令人兴奋。

Con:先例不多。 这样做的例子并不多。 公共示例(twitter.com)感觉迟缓并且甚至不采用这种方法。

REST SERVER + SERVER-SIDE HTML客户端

制作仅JSON的REST API服务器。 制作一个基本的HTML网站客户端,只能访问REST API。 较少的客户端JavaScript。

Pro:我喜欢API和客户端的分离。 但提供纯HTML5是相当简单的,而不是客户密集型的。

Con:先例不多。 这样做的例子并不多。 框架也不支持这一点。 不知道如何处理它。

特别是从经验中寻找建议,而不仅仅是理论上的。


在Boundless,我们已经深入了解选项#2并将其推广给成千上万的学生。 我们的服务器是JSON REST API(Scala + MongoDB),我们所有的客户端代码都是直接从CloudFront提供的(例如:www.boundless.com只是CloudFront的别名)。

优点:

  • 新锐/激动人心
  • 对你的压力很大:API为你自己的网络客户端,移动客户端,第三方访问等提供基础。
  • 非常快速的网站加载/页面转换
  • 缺点:

  • 没有更多的工作,对SEO不友好/准备就绪。
  • 需要一流的网络前端人员,他们已经准备好应对具有70%JavaScript网站体验的实际情况,这意味着什么。
  • 我确实认为这是所有网络应用程序的未来。

    对网络前端人员的一些想法(这是所有新/挑战都来自这种架构的地方):

  • CoffeeScript的。 更容易生成高质量的代码。
  • 骨干。 伟大的方式来组织你的逻辑和积极的社区。
  • HAMLC。 Haml + CoffeeScript模板=> JS。
  • 上海社会科学院
  • 我们已经为我们的前端开发构建了一个名为'Spar'(单页应用程序Rocketship)的线索,它实际上是Rails针对单页应用程序开发进行调整的资产管道。 我们将在接下来的几周内在我们的github页面上开放采购,并附上博客文章,更详细地解释如何使用它和整体架构。

    更新:

    关于人们对Backbone的担忧,我认为他们的评价过高。 骨干远不止是一个深层框架,而是更多的组织原则。 Twitter的网站本身就是一个Javascript的巨兽,它覆盖了数百万用户和传统浏览器的每一个角落,同时实时加载推文,垃圾收集,显示大量多媒体等等。在所有'纯粹'的js网站中,看,Twitter是奇怪的一个出来。 有很多令人印象深刻的复杂的应用程序通过JS交付,非常好。

    你的建筑选择完全取决于你的目标。 如果您正在寻找支持多个客户并获得优秀前端人才的最快方式,那么投资独立API是一个很好的选择。


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

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

    选项1

    这一个无疑是最受欢迎的一个。 但我觉得实现非常多http-ish。 每个API的初始代码都在处理请求对象。 所以API代码不仅仅是纯ruby / python /其他语言代码。

    选项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调用。因此,服务器端处理随着渲染而增加,但可能通过对API服务器的较少http调用来补偿。

    现在,页面在服务器上呈现服务器,前端现在更多地与编程环境相关联。 这可能不是许多应用程序的考虑因素。

    Twitter案例

    据我所知,Twitter可能会在服务器上进行初始页面渲染,但对于页面更新,它仍然有一些API调用和客户端模板来操纵DOM。 所以在这种情况下,你有两个模板来维护,这增加了一些开销和复杂性。 与Twitter不同,并非每个人都可以承受这种选择。

    我们的项目堆栈

    我碰巧使用Python。 我使用JsonRPC 2.0而不是REST。 我建议REST,尽管我喜欢JsonRPC的各种理由。 我使用下面的库。 有人考虑选项2/3可能会发现它有用。

  • API服务器:Python一个快速的Web微型框架 - Flask
  • 前端服务器:Nginx
  • 客户端MVC:Knockout.js
  • 其他相关工具/库:
  • jQuery的
  • 用于货币的Accounting.js
  • Webshim:跨浏览器polyfill
  • 导演:客户端路由
  • sphc:HTML生成
  • 我的结论和建议

    选项3 !.

    所有说,我已经成功地使用了选项2,但现在倾向于选项3为简单起见。 使用构建脚本生成静态HTML页面并使用专门提供静态页面的超高速服务器提供服务非常诱人(选项2)。


    建设gaug.es时,我们选择了#2。 我从事API(ruby,sinatra等)和我的业务合作伙伴史蒂夫史密斯(Steve Smith)开发了前端(JavaScript客户端)。

    优点:

  • 平行移动。 如果我在Steve之前工作,我可以继续为新功能创建API。 如果他在我之前工作,他可以​​非常容易地伪装API并构建UI。

  • API免费。 开放访问您应用中的数据正在迅速成为标准功能。 如果你从头开始使用API​​,你可以免费获得这个API。

  • 清洁分离。 最好将您的应用程序视为客户端的API。 当然,第一个也是最重要的客户端可能是网络客户端,但它可以让您轻松创建其他客户端(iPhone,Android)。

  • 缺点:

  • 向后兼容性。 这与您的直接问题相关的API更多,但是一旦您的API出现在那里,您不能仅仅打破它,或者打破所有客户端。 这并不意味着你必须移动得更慢,但这意味着你必须经常让两件事情同时工作。 添加到API或新字段是好的,但更改/删除不应该在没有版本控制的情况下完成。
  • 我现在不能再想到任何缺点了。

    结论:如果您打算发布一个API,API + JS客户端就是要走的路。

    PS我也建议在发布之前完整记录您的API。 记录Gaug.es API的过程确实为我们提供了帮助

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

    链接地址: http://www.djcxy.com/p/1229.html

    上一篇: Separate REST JSON API server and client?

    下一篇: RS — How to return JSON and HTTP status code together?