Grape - RailsでスピーディにAPIを作成! 

RailsやSinatra、RubyでAPIを作成する際に便利なGem『Grape』の紹介です。

このGemは簡単にjson、xml、txtなどのAPIを作成できます。それだけではなく、APIのバージョン管理やパラメータのバリデーション、モジュール化など、本格的なAPIを作る上で必要になる機能も持っています。

今回はハッカソンの中ではじめてGrapeを使ってJSON APIを作ったので内容は浅めですが、備忘録として残しておきます! もし何かお気付きの点等有ればコメントください。


🐹 Gemのインストール

Gemfileに以下を追加して、コンソールでbundleを実行してください。

# API Support
gem 'grape'

🐝 APIのサンプル

Twitterを模倣したサンプル(?)が、公式のGitHubのREADMEに書かれていたので転載。

app/api/Twitter.rbを作成して、次のようなコードを書きます。

module Twitter
class API < Grape::API
# versionは:headerや、:paramなどもあり
version 'v1', using: :path, vendor: 'twitter'
format :json
helpers do
def current_user
@current_user ||= User.authorize!(env)
end
def authenticate!
error!('401 Unauthorized', 401) unless current_user
end
end
resource :statuses do
desc "Return a public timeline."
get :public_timeline do
Status.limit(20)
end
desc "Return a personal timeline."
get :home_timeline do
authenticate!
current_user.statuses.limit(20)
end
desc "Return a status."
params do
requires :id, type: Integer, desc: "Status id."
end
route_param :id do
get do
Status.find(params[:id])
end
end
desc "Create a status."
params do
requires :status, type: String, desc: "Your status."
end
post do
authenticate!
Status.create!({
user: current_user,
text: params[:status]
})
end
desc "Update a status."
params do
requires :id, type: String, desc: "Status ID."
requires :status, type: String, desc: "Your status."
end
put ':id' do
authenticate!
current_user.statuses.find(params[:id]).update({
user: current_user,
text: params[:status]
})
end
desc "Delete a status."
params do
requires :id, type: String, desc: "Status ID."
end
delete ':id' do
authenticate!
current_user.statuses.find(params[:id]).destroy
end
end
end
end

😎 パラメータの必須・任意の制御

APIでパラメータを必須にする場合と、任意にする場合はこちらのDSLで制御。

requires :id, type: String # => 必須
optional :text, type: String #=> 任意
optional :status, type: String regexp: /^[a-z]+$/ #=> regexpで正規表現チェック
optional :color, type: String, default: 'blue' #=> defaultで初期値

バリデーションはAPIの要ですので、かなり考えられている印象です。詳しくは、公式GitHubの説明がわかりやすいです。

😸 Rails側への設定

Railsでapiファイルを自動で読み込むように、config/application.rbに次のコードを追加。

config.paths.add "app/api", glob: "**/*.rb"
config.autoload_paths += Dir["#{Rails.root}/app/api/*"]

APIのルーティングを追加。

mount Twitter::API => '/'

🐯 まとめ

ということでAPIを簡単・スピーディに構築できました。 また別のプロジェクトでAPIを作成したら、内容を追加していきます!

🎃 参考リンク

intridea/grape Wiki

Ruby - RailsとGrapeで行う最高のWeb API開発

Grape + RSpec + json_expressions で Awesome な API の受け入れテスト

Rails - Grape | API生成マイクロフレームワーク

📚 おすすめの書籍