Ruby API

Choose the route system -- Sinatra likes or Rails likes?

现在多数的时候会选择RESTful的api,sintra和rails都是RESTful的,但风格却大不相同。

  1. Rails的路由其实是Resource-Oriented
    每个uri其实对应一个resource,controller的方法对应在此基础上的操作。
    换句话说,非常契合RESTful(uri定义资源,http method 定义操作)。

    并且,rails讲各种资源很好的分开了。
    换句话说rails帮你做了很多事,代码更好管理。

  2. Sinatra 是 in terms of HTTP requests/responses,是RESTful like
    特点是灵活、直观,简单。

    但很多事情要自己做。

一般来讲,比较简单的应用,Sinatra这样的路由系统比较合适。
但一旦项目大起来,你会发现,Sinatra项目会越来越像Rails,要么会越来越难以维护。

Why grape + rails?

grape的路由系统其实更像Sinatra,既然选择了rails,那么一定程度上说明,并不喜欢Sinatra的风格。
但为什么很多项目都会选择rails + grape的架构呢?

在我实际接触过的项目中,大体都是这样的流程。
先是有rails的web项目,项目写到一定程度后,需要提供一套(公共的)API,而且这套API相对原有的web应用,要简单的多。

比如使用Grape的Artsy.net(域名真相asp.net啊。。。)就是这种情况。
他们的web端用rails(MVC)+ backbone,API使用grape
从他们的文档来看,API操作并不复杂。

But why?
我们做这样一个假设,如果不引入grape,会是一个什么样的情况?

那么我们controller中的某些方法,会做两件事,一,为web提供服务,二,为API提供服务。

任何情况下,一个方法,做两件事,都是很糟糕的。

那么我们给api提供单独的api-controller,这样的话会有很多api-controller,而且多数的api-controller会只有很少的代码。
那么还不如把这些api都放在一个文件里,而grape恰恰很好的解决了这两个问题。

所以,有web项目,有需要提供(公共的)api,而且,这个API有比较简单、比较少。
用grape恰好把这些API同原有的web项目分离,并且提供很多很好用的DSL。所以这个时候grape是最好的选择。

但,如果API越来越复杂了呢?一般会引入grape-entity,

你会惊喜的发现,引入了grape-entity,一个Model有了对应的entity文件,以及对应的API文件,你会发现,grape越来越像rails了。。。

Grape

  1. 使用情景
    1. 简单应用
    2. web应用 + 简单API(见上一段也已经说明了)
    3. 单独挂在在rails下,性能好
  2. 简单,直接。文档全,流行。很多问题都能在网上找到解决方案。很多基于grape的gem
  3. 好用的API DSL
  4. 分离
    1. 单独文件
    2. 跟rails分离
      选择rails,相当于告别了很多rails的东西。
      1. 结构上来说,几乎告别了Resource-Oriented,当然也可以使用grape-entity。再把去掉的这些东西加回来。
      2. 功能上,error handling, logging, middleware stack 都和rails分离了

rocket_pants

  1. 没有views层
    需要在model中定义serializable_hash来expose数据。
  2. 不单独分出API文件,直接在controller里面写。
  3. 方便的写API DSL。

acts_as_api

根据文档,这个gem,主要做的工作是,数据的显示(data represtion),并这部分功能被放到model。

换句话说,只是为API中数据显示提供了一些机制。

个人觉得,数据如何展示不应该是model的职责。但,其实放到model层也有一定的好处。这个就仁者见仁,智者见智了。

rocket_pants

大体来说可以很好的为api服务,并且和rails配合更好。

  1. 没有views层
    需要在model中定义serializable_hash来expose数据。

  2. 不单独分出API文件,直接在controller里面写

      class ApplicationController < RocketPants::Base
      end
    
      class UsersController < ApplicationController
        def index
          expose ....
        end
      end
    
  3. 可以很方便的写API。
    比如
    Registering / Dealing with Errors
    Built-in Header Metadata Support
    version ....

versionist && api-versions

主要是为API提供了版本机制。
versionist的不同版本间需要copy,past,这点比较不能接受。

而api-versions通过继承,共享代码,所以推荐versionist。

最后

还是要根据项目的需求,具体选择API。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • Awesome Ruby Toolbox Awesome A collection of awesome Ruby...
    debbbbie阅读 2,847评论 0 3
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,089评论 4 62
  • 我很少看动漫,从前,甚至是排斥的,可能是因为基因里缺少叫做热血的成分。 听说《蜂蜜与四叶草》有好多年了,直到最近才...
    Deardeer迷路的麋鹿阅读 372评论 0 0
  • 一排排的杨树林,在春天满眼绿色的季节里,有点显得苍凉。 五点的日落,虽然不够浓烈,却依然有橙黄的光线。暖暖的。 带...
    摄影师李瑕Melissa阅读 325评论 0 1
  • 提起孤独,许多人都有种恐惧感。其实,生活里任何人都要面对,谁也无法真正意义上能够躲开孤独的。 孤独...
    易梦的原野阅读 590评论 2 7