这是三部分中的第一部分,我们会用Rails、Grape API和Grape-Entity来构建开发API。如果你不是很了解API,那么这篇文章会比较适合你。
现在,我们的目标是构建开发API来管理书店。我们可以获取所有书的信息,一本特定书的信息和它的评论,同时也可以针对某一本书来追加评论。
让我们来开始第一部分——通过API来返回所有书的信息。
创建App
首先,用'rails'命令来创建一个简单的App。(我用的是ruby-2.3.1,rails-5.2.2)
而后,我们需要创建models和controllers。我们有两个models,分别是Book和Flow。
rails g model Book isbn:integer title stock:integer
rails g controller Books
rails g model Flow previousStock:integer newStock:integer book:references
rails g controller Flows
执行迁移
rails db:migrate
不要忘记在向你的book.rb文件添加has_many :flows。
添加Gems
我们要添加3或4个主要的gem来构建我们的API。
Grape:类RESET API微框架,是为了完善现有的web应用框架(如:Rails,Rack,Sinatra),它提供了简单的DSL以方便实现API。它内建了对通用约定的支持,如多种格式,子域/前缀的限定和版本。
Grape-Entity:将API返回的数据抽象到一处。
Grape On Rails Routes:可视化API路由。
Faker:制作测试数据用。
gem 'grape'
gem 'grape-entity'
gem 'grape_on_rails_routes'
gem 'faker'
我们添加了上面的Gem到Gemfile文件中并执行bundle命令。
创建数据
我们已经安装了Faker,所以我们可以使用它。在seeds.rb文件中添加代码:
15.times do
Book.create!(isbn: Faker::Number.number(4),
title: Faker::Superhero.power,
stock: Faker::Number.between(2, 19))
end
book_ids = Book.ids
95.times do
Flow.create!(book_id: book_ids.sample,
newStock: Faker::Number.between(2, 15),
previousStock: Faker::Number.between(2, 15))
end
执行rails db:seed命令。可以通过rails c来查看数据库是否创建了相关数据。
如果以上事情都做完了,我们接下来要做的就是构建自己的API。
构建API
首先,我们要告诉我们的应用我们的API将会写在哪里。在这里我们要向config/application.rb文件中添加如下代码:
config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
总的来说,它帮助应用来寻找API的路径。
现在我们需要在app文件夹下创建API文件夹,在API文件夹下创建book_store文件夹。
mkdir -p app/api/book_store
我们的API需要一个根,所以我们需要创建base.rb文件,它可以在book_store文件夹中找到。
touch -p app/api/book_store/base.rb
我们可以在这个文件中添加如下代码:
module BookStore
class Base < Grape::API
mount BookStore::V1::Books
end
end
mount BookStore::V1::Books:这是一个API的路径,我们将在books.rb文件中写API方法。
路由(Route)
我们之前忘记添加从app访问API的路由,所以现在来向config/routes.rb中添加。
mount BookStore::Base => '/'
我们可以看到API是从base开始的。(base.rb)
创建方法
创建V1文件夹,它将包含前面提到的books.rb。
mkdir -p app/api/book_store/v1
touch app/api/book_store/v1/books.rb
打开books.rb并写入如下代码:
module BookStore
module V1
class Books < Grape::API
version 'v1', using: :path
format :json
prefix :api
resource :books do
desc 'Return list of books'
get do
books = Book.all
present books
end
end
end
end
end
有关于上述代码的一些解释:
version ‘v1’, using: :path :我们指定的API版本。
format :json :API返回的数据格式为JSON。
prefix :api :访问API时的前缀。
resource :books :指定路由为books。
desc ‘Return list of books’ :对于API的一些说明
最后一步
在启动我们的API之前,我们可以通过grape路由来检查一下我们的API可以访问。
rails grape:routes
我们会看到如下面这样的结果
GET | /api/:version/books(.json) | v1 | Return list of books
现在我们可以访问我们的API了。http://localhost:3000/api/v1/books
译自
https://medium.com/@clementrollon/build-a-basic-api-with-grape-api-grape-entity-part-1-5d5fa1cf38db
网友评论