ruby-on-rails-3 - rails创建项目 - rails应用



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

我即将从头开始创建一系列网络应用程序。 (请参阅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:先例不多。 这样做的例子并不多。 框架也不支持这一点。 不知道如何处理它。

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

https://src-bin.com


Answer #1

REST服务器+ JavaScript重用客户端是我在最近的工作中遵循的原则。

REST服务器在node.js + Express + MongoDB (非常好的写入性能)+ Mongoose ODM (非常适合建模数据,包含验证)+ CoffeeScript (现在我会去ES2015),这对我来说非常合适。 与其他可能的服务器端技术相比,Node.js可能相对年轻,但它使我可以用集成的支付编写可靠的API。

我已经使用Ember.js作为JavaScript框架,并且大部分应用程序逻辑都是在浏览器中执行的。 我已经使用SASS (SCSS专门)进行CSS预处理。

Ember是由强大社区支持的成熟框架。 这是一个非常强大的框架,最近大部分工作都集中在性能上,比如全新的Glimmer渲染引擎 (受React的启发)。

Ember Core Team正在开发FastBoot ,让你在服务器端执行你的JavaScript Ember逻辑(特别是node.js),并将你的应用程序的预渲染的HTML(通常在浏览器中运行)发送给用户。 这对搜索引擎优化和用户体验非常有用,因为他不会等待页面显示。

Ember CLI一款很棒的工具,可以帮助您组织代码,并且可以很好地扩展代码库。 Ember还拥有自己的插件生态系统,您可以从各种Ember插件中进行选择。 您可以轻松获取Bootstrap(在我的情况下)或Foundation,并将其添加到您的应用程序。

不要通过Express提供所有服务,我选择使用nginx来提供图片和JavaScript重载客户端。 在我的情况下使用nginx代理很有帮助:

upstream app_appName.com {
  # replace 0.0.0.0 with your IP address and 1000 with your port of node HTTP server
  server 0.0.0.0:1000;
  keepalive 8;
}

server {
  listen 80 default_server;
  listen [::]:80 default_server ipv6only=on;

  client_max_body_size 32M;

  access_log  /var/log/nginx/appName.access.log;
  error_log  /var/log/nginx/appName.error.log;

  server_name appName.com appName;

  location / {
     # frontend assets path
     root /var/www/html;
     index index.html;

     # to handle Ember routing
     try_files $uri $uri/ /index.html?/$request_uri;
  }

  location /i/ {
    alias /var/i/img/;
  }

  location /api/v1/ {
    proxy_pass  http://app_appName.com;

    proxy_next_upstream error timeout invalid_header http_500 http_502
http_503 http_504;
    proxy_redirect off;
    proxy_buffering off;
    proxy_set_header        Host            $host;
    proxy_set_header        X-Real-IP       $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

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

我可以说这在实践中也很棒。 分离REST API的另一个优点是您可以稍后重新使用它以用于其他应用程序。 在完美的世界中,如果你决定编写一个,你应该能够使用相同的REST API不仅用于网页,而且还用于移动应用程序。

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

事情现在看起来不同。 有很多REST API +许多客户端在使用它的例子。


Answer #2

一个非常好的问题,我很惊讶,因为我认为现在这是一个非常普遍的任务,我会为这个问题提供大量资源,但事实证明这不是真的。

我的想法如下: - 创建一些模块,它们在API控制器和HTML控制器之间具有公共逻辑, 而无需返回json或呈现html,并将此模块包含在HTML控制器和API控制器中,然后执行任何您想要的操作,例如:

module WebAndAPICommon
    module Products

        def index
            @products = # do some logic here that will set @products variable
        end

    end
end


class ProductsController < ApplicationController
    # default products controlelr, for rendering HMTL pages 
    include WebAndAPICommon

    def index
        super
    end

end



module API
    class ProductsController
        include WebAndAPICommon

        def index
            super
            render json: @products
        end

    end
end

Answer #3

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是一个很好的选择。


Answer #4

在Rails中构建JSON API是第一类,JSONAPI :: Resources gem为http://jsonapi.org spec'd API执行了繁重的工作。


Answer #5

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

优点:

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

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

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

缺点:

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

我现在不能再想到任何缺点了。

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

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

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


Answer #6

当我的网站不会成为我的数据的100%CRUD实现时,我喜欢#3。 哪些还没有发生。

我更喜欢sinatra,并将应用程序分成几个不同目的的不同机架应用程序。 我将制作一个API特定的机架应用程序,它将涵盖我需要的API。 然后可能是一个用户机架应用程序,将呈现我的网页。 有时候,如果需要,该版本将查询API,但通常它只关注自己的html网站。

我不担心它,只需要从用户端执行持久层查询。 我并不过分关心创建一个完整的分离,因为他们通常最终会服务于不同的目的。

这是使用多个机架应用的一个非常简单的例子。 我在那里添加了一个快速的jquery示例,让您看到它打到API应用程序。 您可以看到Sinatra和安装具有不同用途的多个机架应用程序有多简单。

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


Answer #7

我个人更喜欢选项(3)作为解决方案。 它几乎用于我的前雇主(家喻户晓)的所有网站。 这意味着你可以得到一些前端开发人员,他们知道所有关于Javascript,浏览器怪癖和不知道如何编写前端代码的知识。 他们只需要知道“卷曲xyz,你会得到一些json”,然后他们就走了。

同时,您的重量级后端人员可以对Json提供商进行编码。 这些人根本不需要考虑演示,而是担心后端的片状,超时,优雅的错误处理,数据库连接池,线程和缩放等。

选项3为您提供了一个良好的,坚实的三层架构。 这意味着你从前端吐出的东西是SEO友好的,可以与旧的或新的浏览器(以及JS关闭的那些)一起工作,并且如果你想要的话,仍然可以是Javascript客户端模板化(所以你可以像使用静态HTML处理旧浏览器/谷歌机器人一样,但将JS内置的动态体验发送给使用最新Chrome浏览器或其他软件的用户)。

在所有我见过的Option 3的情况下,它都是一些PHP项目的自定义实现,不能在项目之间转移,更不用说开源项目了。 我想最近PHP可能已经被Ruby / Rails所取代,但同样的事情依然如此。

FWIW,$ current_employer可以在一些重要的地方使用选项3。 我正在寻找一个良好的Ruby框架来构建一些东西。 我确信我可以将一堆宝石粘合在一起,但我更喜欢单一的产品,广泛提供模板,'卷曲',可选身份验证,可选的memcache / nosql连接缓存解决方案。 在那里,我没有找到任何一致的:-(


Answer #8

我们使用#3的以下变体:制作仅JSON的REST API服务器。 制作一个HTML网站服务器。 与您的变体一样,HTML Web服务器不是REST API服务器的客户端。 相反,这两个人是同龄人。 在表面之下,有一个内部API提供两台服务器所需的功能。

我们不知道有任何先例,所以它是一种实验性的。 到目前为止(即将进入测试版)​​,它已经非常成功。


Answer #9

我已经采用了一种混合方法,在这种方法中,我们将Sinatra用作基础,ActiveRecord / Postgress等来提供页面路径(slim模板),以暴露Web-app可以使用的REST API。 在早期开发中,像填充选择选项一样,通过helper渲染到超薄模板中完成,但随着我们接近生产,我们开始关注页面加载速度等等,因此将其换成AJAX对REST API的调用。

在Slim中易于渲染的东西会以这种方式进行处理,而东西(填充表单,从jQuery.Validation的submitHandler等接收表单POST数据,都显然是AJAX)

测试是一个问题。 现在我很难将JSON数据传递给Rack :: Test POST测试


Answer #10

我更喜欢去#2和#3的路线。 主要是因为#1违反了关注点分离和各种各样的东西混杂。 最终你会发现需要有一个没有匹配HTML页面的API端点,并且你将会在同一个代码库中混合使用HTML和JSON端点。 它变成了一个疯狂的混乱,即使它的MVP,你也不得不重新写它,因为它太脏了,它甚至不值得打捞。

无论使用#2还是#3,都可以让您完全拥有相同的API(大部分)。 这提供了很大的灵活性 我还没有100%在Backbone / ember / whatever / etc.js上销售。 我认为它很棒,但正如我们在twitter上看到的那样,这不是最佳选择。 但是...... Twitter也是一家公司的巨兽,拥有数亿用户。 因此,任何改进都会对各业务部门的各个领域的底线产生巨大影响。 我认为这个决定比速度还要多,他们也不会让我们这样做。 但那只是我的个人意见。 但是,我不打折骨干和它的竞争对手。 这些应用程序非常好用,非常干净,响应速度非常快(大部分)。

第三个选项也具有一些有效的吸引力。 这是我遵循Pareto原则(80/20规则)的地方,并且在服务器上呈现20%的主标记(反之亦然),然后让一个漂亮的JS客户端(主干/ etc)运行其余的部分。 您可能无法通过JS客户端与REST API进行100%的通信,但如果需要,您可以进行一些工作,以使SUER体验更好。

我认为这是“这取决于”这类问题之一,答案是“取决于”你正在做什么,你正在服务的对象以及你希望他们接受什么样的体验。 鉴于我认为你可以决定2或3或他们的混合。


Answer #11

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

我们选择这种方法的原因有很多,但都非常清楚,由于它尚未得到广泛的证明,所以它有点冒险。 所有的一切,一切都很顺利到目前为止。

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

让这两个项目完全独立,是选择这种基础设施的关键考虑因素。 如果您正在寻找一种架构来混合不同的独立资源而没有任何依赖关系,那么这种方法值得一看。

恐怕我不是一个红宝石男人,所以我不能评论其他方法。 有时冒险是可以的。 其他时候,最好是保证安全。 您将根据项目类型自行决定。

祝你在这里好运。 很想看看其他人分享的内容。


Answer #12

我通常会选择第二种选择,使用Rails构建API,并为JS提供主干。 您甚至可以使用ActiveAdmin免费获得管理面板。 我已经用这种后端发送了数十个移动应用程序。 但是,这很大程度上取决于您的应用程序是否为交互式。

我在最后的RubyDay.it上做了一个关于这种方法的介绍: http://www.slideshare.net/matteocollina/enter-the-app-era-with-ruby-on-rails-rubyday : //www.slideshare.net/matteocollina/enter-the-app-era-with-ruby-on-rails-rubyday

对于第三个选项,为了获得第二个选项的响应能力,您可能希望像Github一样尝试pajax





ember.js