既存 Rails アプリに REST API を追加する
既存 Rails アプリに REST API を追加する
前回に引き続き、Rails Tutorial で作成したアプリに REST API を追加していく。
- Doorkeeper で OAuth 認証
- Grape で REST API 実装
とする。
OAuth 認証は前回終わったので、Grape を使った REST API 実装から。
Grape の使用
Gemfile に以下を追記する。
gem 'grape`
以下を実行する。
$ bundle install
grape が使えるようになる。
続いてAPIの作成に入る。
ひとまず動作することを確認したいので、
/api/v1/users/
- 全ユーザー情報の取得
/api/v1/users/{id}
- 指定した id のユーザー情報の取得
ぐらいを実装してみる。
今後のバージョンアップ(今の所予定は無いが)に備えて v2 を作ってみて動くかどうか、も合わせて確認しておく。
- ディレクトリ, ファイルの作成
- 必要な実装
- ルーティングの追加
と進める。
ディレクトリ名は API のパスと合わせる必要がある。
$ mkdir -p app/api/v1 $ mkdir app/api/v2 $ touch app/api/v1/users.rb $ touch app/api/v2/users.rb
users.rb を以下のように書き換える。
module V1 class Users < Grape::API version 'v1', using : :path format :json prefix :api resource :users do get do User.all end params do requires :id, type: Integer, desc: 'User id.' end route_param :id do get do User.find(params[:id]) end end end end end
v2 ディレクトリ以下も module V2
, version 'v2'
のみ変更して同じ内容で作成しておく。
上記でとりあえず目当ての情報を返却するAPI(保護なし)ができる。
ルーティングの設定を行う。
Rails.application.routes.draw do ・ ・ ・ mount V1::Users => '/' mount V2::Users => '/' end
$ rails s
して
- /api/v1/users にアクセスして全ユーザー情報を取得
- /api/v1/users/1 にアクセスしてユーザーIDが 1 のユーザー情報を取得
- /api/v2/users にアクセスして全ユーザー情報を取得
これらが確認できた。
REST API の保護
このままでは誰でも情報にアクセスできてしまう。
前回実装した OAuth を使って認可済みユーザーのみがアクセスできるように実装を修正して行く。
調べてみると、これがまんま使えそう。
doorkeeper-gem_doorkeeper_ Doorkeeper is an OAuth 2 provider for Rails.
users.rb
require 'doorkeeper/grape/helpers' module V1 class Users < Grape::API ・ ・ ・ prefix :api helpers Doorkeeper::Grape::Helpers before do doorkeeper_authorize! end resource :users do ・ ・ ・
以上!(まじかよ
前回同様コンソールから irb
で確認してみると、認可済みであれば情報取得できるが、そうでなければエラーとなることがわかる。
その他
ひとまず動きはしたので、
- API ドキュメンテーションの追加
- 他 API の追加
と進める。
ところで全ユーザー情報の取得って、パスは index
とかの方がいいの?
余裕があれば REST API のページネーションについてもちょっと調べてみようかな。
Twitter とかみたら参考になるんだろうか。