Grit + Grape使用心得

October 21, 2013 19:58


最近做的一个小项目,使用了大概二十六七个小时, Grit + Grape, 同时也对Goliath了解了下, 写下使用心得体会,刚上手,感觉就了解这是做什么的,基本的使用。。

项目代码

Goliath

先说 Goliath 吧, 一个事件驱动的非阻塞 Ruby 服务器框架, 支持Rack Api 及 中间件, 使用上也比较简单:

#!/usr/bin/env ruby
require 'goliath'

class Application < Goliath::API
  def response(env)
    MyApp.call(env)
  end
end

看了一堆文档,真要用时,我就只用了这几句代码。MyApp是自己的Rack规范的应用, 使用应当同Rack一样,不过启动时有些差别

$ ./myapp -sv -p 3000

如上, s是 stdout log, v是详细的log, p 自然是服务器监听的端口了

Grape

Grape 以前也只是在github看到过有这么个东西, 到是没去了解与使用过,对写api帮助很大,不过还是有些地方用着没Rails舒服(应该是我对这框架的不太熟悉的原因)

require 'goliath'
require 'grape'

class API < Grape::API
  version 'v1', using: :path
  format :json


  resources :books do
    desc "Return all books."
    get :list do
      Book.all
    end


    desc "Book details"
    params do
      requires :id, :type => Integer
      optional :foo
    end
    get :details do
      Book.find(params[:id])
    end
  end
end

class Application < Goliath::API
  def response(env)
    API.call(env)
  end
end

如上所示,version 'v1' 可以带参数 using, path可就会在route前加上/v1/xx, resources 同 namespace 一样,就一个路径,desc 看文档写着也不知道有什么用, 就直接写着当是描述了,感觉还不如写注释。然后基本的请求方式 get post 之类

其中的params是个不错的东西,可以对参数进行验证,有requires 与 optional, 第一个参数是api需要的参数名,如果为requires,请求时没带这个参数将返回错误信息, 我要吐槽的是,错误信息都自己返回了,不喜欢默认的错误信息格式。当然, 验证失败时会返回400的状态

接下来就是 requires与 optional的扩展验证了,type 可以指定一个类型, 看文档说是指定了就可以自动强制转换?

“When a type is specified an implicit validation is done after the coercion to ensure the output type is the one declared.” 但是我指定为Integer时,提交 "1",死活就是过不去,于是不使用 :type参数了。。

还有一个地方,感觉文档说的不清楚啊(其实是example不多。。),如下

class API < Grape::API
  resource "files" do
    get '/(*path)' do

    end
  end
end

上面我请求 /files/a/b 没一点问题,但我要是请求 /files时,居然返回 No Found, 又去Github看了下文档,说应该(英文烂不敢肯定了。。)是要指定 anchor: false, 不过我加了后,还是进不了,没办法了,只能 get '/' + get '/*path', 略郁闷

Grit

上面的还好,最郁闷的是Grit,恩一路住下看,最后看到的是

"There are many more API methods available that are not documented here. Please reference the code for more functionality."

居然让我看源代码,好吧。。先把文档写来的东西看了,了解了一下大概的流程,就开始接着写api了, 写到commit时发现有点困难,用了很烂的方法写了点,发现commit快速创建时,再查看commit时, 顺序乱了。我无语。最前面的commit到最后去了,以为文档上写的有问题,反过来用, 开始时不时测试时出现错误,我再测时又没了。。

tree比较简单,随便写了几个显示tree.contents的api,到最后blob操作时,发现有点不懂了, 只会show, 怎么创建,更新都不知道了,累捉急,没办法,直接啃源代码了

啃完repo, commit, tree, blob的后,发现还是不懂,比如分支创建,什么的, 文件创建一定要在目录里写入文件后提交才行?那分支切换怎么办?

没办法了,google里找找,知道了repo.index,几个小时的使用后,才知道原来如此, 虽然还有很多神秘的东西不了解,但基本的已经知道怎么用了

通过repo.index 来增加修改文件,及提交指定的分支,从指定的commit提交,各种。。 发现我又对git了解多了很多,其实我用了两三年git,知道的也就是push pull branch merge 等简单的东西,因为工作中已经够用了,所以没再去了解更多

index = repo.index
index.add('path/to/file', 'data')
index.commit('message', [repo.commits('master').first], nil, nil, 'dev_branch')

通过index提交的东西都是直接进入.git目录索引里面的

另外在使用Grit时,发现一个大坑,开始用的ruby 2.0,到tree时,老是出错,基本上是没法玩了, 去google搜索下才知道,原来是不支持2.0,我郁闷的再装上ruby1.9.3。。

Comments: