プログラム関係の備忘録。技術系記事1000記事以上を目指すブログ

Rails&Grapeを使ってAPIの踏み台サーバーを作る

  • 2019年5月10日
  • 2019年5月10日
  • Ruby
  • 491view
  • 1件

はじめに

Ruby on Railsを使ったWebAPI作成をGrapeを使った構成にする。ついでなのでRailsアプリ自体をAPIモードというので新規作成してみる。

今回作る構成は踏み台サーバーとしての構成です。
APIを叩くと他サービスのAPIを叩くという構成にしていきたいので、DBなしの最小の最小構成にしてみます。

Grapeって?

端的に書くと「RubyでREST APIを実装するためのフレームワーク」のことで、RailsにGrapeを組み合わせることで捗って楽だよってやつのようです。

もちろん標準のRailsでControllerで処理を書いて~ってやってもいいのですが、まっさらな状態からWebAPI作るならせっかくだからそういう便利ツールも覚えておこうってことでやってみました。

APIモードでのRailsアプリの作成

プロジェクトを生成する

rails new rails_api_grape --api -T

通常と違うのは–apiオプションを付けているところです。
今回はテスト関連もいらなかったので-Tオプションも指定しています。

gemfileの29行目のコメントアウトを外す。
クロスオリジンでのアクセスを許可するために必要です。
その後プロジェクトがあるディレクトリ配下でbundle installを実行。

corsの設定ファイルを編集

先ほどのbundle installで生成されたファイルが「/config/initializers/cors.rb」にあるので、そのファイルを以下に編集する

# Be sure to restart your server when you modify this file.

# Avoid CORS issues when API is called from the frontend app.
# Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin AJAX requests.

# Read more: https://github.com/cyu/rack-cors

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'

    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

Grapeのインストール

前回Railsでbootstrap4を使えるようにしたときと同じ感じで、Gemfileに以下を追加し、bundle installコマンドを叩く

gem 'grape'

ディレクトリの準備

appディレクトリ下に、以下のようにディレクトリを新規作成する

baseAPIを作成し、routesでマウントする。

module Base
    class API < Grape::API
        mount V1::Root
    end
  end
Rails.application.routes.draw do
  mount Base::API => '/'
end

各APIをマウントするファイル(root.rb)を作成する

module V1
    class Root < Grape::API
        prefix "api"
        version :'v1'
        format :json
        # mount V1::Tests
    end
end

APIを実装する

tests.rb

module V1
    class Tests < Grape::API
        desc ''
        get '/tests' do
            { status: 'SUCCESS', message: 'loaded posts', data: '' }
        end
    end
end

localhost/api/v1/testsにアクセスしてみる

こんな感じのレスポンスが表示されればOK
これをベースに各処理を追加していく。

{"status":"SUCCESS","message":"loaded posts","data":""}