概要
grapeを使用してRESTfulなAPIサービスを作成したのでまとめる。
また作成後はPostmanを使用して挙動を確認した。
環境
ruby 2.6.5
Rails 5.2.4
実施したこと
・任意のUserをSeedsファイルに作成。gemはgrapeを使用。APIモードにて作成する。
・Postmanを使ってクライアントからアクセスし、データの登録、更新、削除。データの取得を行う
・アプリケーションには一般的なCRUD機能とデータの取得をJSONを用いて取得できるよう作成した
まずアプリケーションを作成
$ rails new sample_app
今回はアプリ名「sample_app」とした。
まずはgemをインストール
下記を追記
gem ‘grape’ # rails、sinatraなどのRackアプリケーションで、RESTfulAPIを簡単に構築できる
gem 'grape-entity’ # grapeのみだと、値が全て表示されてしまう。grape-entityを使うと、表示項目の制限、整形をすることができる。
gem ‘grape_on_rails_routes’ #使用すると、Grape APIによって作成されたルートを簡単に読み書きできる。
続い bundle instalする。
$ bundle install --path vendor/bundle
DBの構成
Usermodelを生成する
$ bundle exec rails g model User name:string email:string age:integer
$ rails db:migrate
サンプル用にデータを用意します。
db/seeds.rbを下記の内容で作成します。
User.create(name: 'Sony', email: 'sony@sample.com', age: '40')
User.create(name: 'Fredo', email: 'fred@sample.com', age: '38')
User.create(name: 'Tom', email: 'tom@sample.com', age: '35')
User.create(name: 'Michael', email: 'michael@sample.com', age: '33')
User.create(name: 'Connie', email: 'connie@sample.com', age: '30')
DBにファイルを読み込ませます。
$ bundle exec rake db:seed
ディレクトリ構成
下記のディレクトリ構成にします。
~/sample_api/
├ app/api/
│ └ api.rb
│ └ resources/
│ └ v1/
│ └ root.rb
│ └ user.rb
│ └ entities/
│ └ v1/
│ └ root_entity.rb
│ └ user_entity.rb
autoloadの設定
app/apiの下のファイルがautoloadされるようにします。
module SampleApi
class Application < Rails::Application
#..
# app/api以下のrbファイルをautoload
+ config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
+ config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
end
end
APIの作成
下記の図のような[親-子-孫-ひ孫]の関係でマウントさせます。
config/routes.rb # [親]ルーティングの設定
└ app/api/api.rb # [子]API親クラス
└ app/api/resources/v1/root.rb # [孫]API v1の親クラス
└ app/api/resources/v1/users.rb # [ひ孫]userAPIのクラス
[親] config/routes.rb
ルーティングの設定をします。
Rails.application.routes.draw do
# app/api/api.rbをマウント
+ mount API => ‘/' #この方法では、基本クラスがクラスの各アクションをポイントするため、各アクションにルートを追加する必要はありません。
end
[子] app/api/api.rb
API親クラスを作成します。
class API < Grape::API
# urlの第1セグメント名 ex) http://localhost/api/
prefix 'api'
# app/api/resources/v1/root.rbをマウント
mount Resources::V1::Root
end
[孫] app/api/resources/v1/root.rb
API v1の親クラスを作成します。
module Resources
module V1
class Root < Grape::API
version 'v1'
format :json
content_type :json, 'application/json'
# app/api/resources/v1/users.rbをマウント
mount Resources::V1::Users
end
end
end
続いてuserAPIのクラスを作成する前にEntityファイルを作成します。
これを作成しないとデータ取得を行った際に作成時間や更新時間など、表示したくないデータが表示されてしまいます。
*全てのデータを取得したい場合は作成不要。
Entityの親クラスを作成
module Entities
module V1
class RootEntity < Grape::Entity
end
end
end
userAPIのEntityファイルを作成
name, email, ageのみ表示するようにします。
(created_at、updated_atは表示させない)
module Entities
module V1
class UserEntity < RootEntity
# name, email, ageのみ表示する
expose :name, :email, :age
end
end
end
userAPIのクラスを作成します。
module Resources
module V1
class Users < Grape::API
resource :users do
desc "user list"
get do
present User.all, with: Entities::V1::UserEntity # with:〜〜とすることでentityファイルの内容を適用させます
end
desc "create new user"
params do
requires :name, type: String
requires :email, type: String
requires :age, type: Integer
end
post do
User.create!({ name: params[:name], email: params[:email], age: params[:age] })
end
desc "Update user"
route_param :id do
put do
User.find(params[:id]).update({ name: params[:name], email: params[:email], age: params[:age] })
end
end
desc "show user"
params do
requires :id, type: Integer, desc: "user id"
end
get ":id" do
present User.find(params[:id]), with: Entities::V1::UserEntity # こちらのデータ取得も同様です。
end
desc "Delete user"
route_param :id do
delete do
user = User.find(params[:id])
user.destroy
end
end
end
end
end
end
$ rails grape:routes or rake grape:routes
GET | /api/:version/users(.:format) | v1 | user list
POST | /api/:version/users(.:format) | v1 | create new user
PUT | /api/:version/users/:id(.:format) | v1 | Update user
GET | /api/:version/users/:id(.:format) | v1 | user_show
DELETE | /api/:version/users/:id(.:format) | v1 | Delete user
上記のコマンドを実行すると、グレープAPIルートのリストを確認できます。
ここまででAPIを作成できました。ここからはPostmanを使用することで実際にCRUD機能、データ取得を正しく行えるか確認していきます。
- user情報を全て取得する
- 指定したidのuser情報を1件取得する
rails起動後上記URIを入力すれば取得の確認が行える。
Postmanを使ってリクエスト、レスポンスの確認
PostmanのURL
https://www.postman.com/
Postmanを起動
登録は指示に従っていけば簡単に行えます。
ローカルサーバー起動
$ rails s
データを作成(Create)
Bodyに登録するデータをJSON形式で設定して、実行する
メソッド:Post
URL:http://localhost:3000/api/v1/users
Body: raw JSON(application/json)
{
“name”: “サンプルさん”
“email”: “sample@example.com”
“age”: 19
}
下記欄に6番目のidで新たにuserが登録されていることが分かる。
データの編集(update)
登録した情報を更新する。
Body要素に変更する情報を設定する。
メソッド:Put
URL:http://localhost:3000/api/v1/users/:id
(:idはdbに登録されているid値 ここでは6を設定)
Body:raw JSON(application/json)
{
“name”: “サンプル”
“email”: “sample1@example.com”
“age”: 20
}
updateが行われている。
データの削除(destroy)
登録している情報を削除する
メソッド:Delete
URL:http://localhost:3000/api/v1/users/:id
(:idはdbに登録されているid値 ここでは6を設定)
先程作成したデータを削除することに成功した。
データの取得(index)
登録した情報をすべて取得する。Seedsデータとして登録されている5つのデータを取得してみる。
メソッド:Get
URL:http://localhost:3000/api/v1/users
下記に登録されているデータが確認できる。
データをid別に取得(show)
登録した情報からidを指定して、特定の情報のみを取得する(削除される前のid:6のデータ情報を取得しています。)
メソッド:Get
URL:http://localhost:3000/api/v1/users/:id
CRUD機能の挙動については確認することができた。Postmanの機能についてはまだ勉強不足であるので深めていく。
またgrape gemについてもまだ様々な機能があるのでそこも学習し、使いこなせるようにしていく。
*参考 API開発・テスト便利ツール Postmanの使い方メモ
https://qiita.com/zaburo/items/16ac4189d0d1c35e26d1
*参考 Postmanを使ってAPIの確認をしてみる
https://qiita.com/me-654393/items/b14824dd9b37de0da163
*参考 RESTFUL API USING GRAPE IN RAILS
https://www.nascenia.com/restful-api-using-grape-in-rails/
*参考 grapeのgithub
https://github.com/ruby-grape/grape