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生成マイクロフレームワーク

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍