techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

既存 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 とかみたら参考になるんだろうか。