美文网首页
使用Grape和Grape-Entity构建一个简单的API——

使用Grape和Grape-Entity构建一个简单的API——

作者: 花前山谷 | 来源:发表于2019-11-27 21:16 被阅读0次

这是三部分中的第一部分,我们会用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

相关文章

网友评论

      本文标题:使用Grape和Grape-Entity构建一个简单的API——

      本文链接:https://www.haomeiwen.com/subject/nvjvyqtx.html