用 Grape 和 Doorkeeper 构建 RESTful API

如何构建一套适合Mobile应用的API。

Grape是一个基于Rack的非常轻量级的框架,用于快速的开发API。一般来说,Rails对于单独的API来说,太过于重量级;而Sinatra虽然足够小巧,但是又没有为开发API提供足够的默认支持。

Doorkeeper 作为 OAuth Provider,为OAuth 认证提供很方便的Rails集成。在系统中对用户的管理,依然使用Devise,Doorkeeper也很方便和Devise进行集成。

Doorkeeper本身为Rails提供认证服务,对Grape不是原生支持,需要WineBouncer来帮忙。

Swagger都不陌生,其新版也支持了OAuth。可以很方便查看和测试API。

Init in Rails

在Rails项目的Gemfile中添加如下,然后运行bundle即完成配置。

Gemfile
1
2
3
4
gem 'grape'
gem 'doorkeeper'
gem 'devise'
gem 'wine_bouncer'

在Controller下建新的api目录,然后新建api.rb文件,先预填如下内容,具体详解:

api.rb
1
2
3
4
5
6
7
8
9
10
11
module Twitter
class API < Grape::API
version "v1", :using => :path
format :json
desc "Test api."
get "hello" do
{ hello: "worldsssss" }
end
end
end

Mount

将Grape挂载到根下:

config/route.rb
1
mount Twitter::API => '/'

这样就可以在浏览器中进行测试了:http://localhost:3000/v1/hello

Grape Config

Versioning

  • Path
    1
    version 'v1', using: :path
  • 1
    version 'v1', using: :header, vendor: 'twitter'
  • Param
    1
    version 'v1', using: :accept_version_header

Nested Reources

Authenticate

Grape::Entity

https://github.com/intridea/grape-entity

With that you can define a “nested entity” for your model:

1
2
3
4
5
6
7
8
9
10
11
12
module YourApp
module Entities
class Blog < Grape::Entity
expose :id, :blog_title
expose :posts, using: YourApp::Entities::Post
end
class Post < Grape::Entity
expose :id, :post_title
end
end
end

Best Pricaties::

REF::