RubyのWebアプリケーションフレームワーク「Ruby on Rails」でWeb APIを作成する

普段のお仕事に役立つ普遍的なプログラミングTIPSや、業界で注目度が高い最新情報をお届けする「編集部ピックアップ」。
今回はRubyのWebアプリケーションフレームワーク「Ruby on Rails(ルビーオンレイルズ)」でWeb APIを作成する方法ついてお届けします。

先日公開した記事では、RubyのWebアプリケーションフレームワーク「Ruby on Rails」でWeb APIを作成する方法をご紹介しました。

今回はRailsで簡単にWeb APIを構築するためのフレームワーク「Grape」を使用して簡単なWeb APIを作成してみたいと思います。

開発環境

  • Ruby 3.0.3
  • Rails 7.0.1

Grapeのインストール

「Grape」はRubyで書かれたWeb API(REST API)を構築するためのフレームワークです。

前回のクイックスタート記事で作成したプロジェクトをベースにGrapeをインストールしていきます。まずはプロジェクト配下の「Gemfile」をエディタで開き、以下を追記します。

gem "grape"

以下のコマンドを実行してインストールを行います。

bundle install

テーブルの作成

次にクイックスタートでインストールしたSQLite上にテストデータとして請求書情報を格納するテーブルを作成します。

モデルの作成

まずは次のコマンドを実行してモデルの作成を行います。

rails generate model Invoice billno:string slipno:string customerid:string customername:string products:string number:integer unitprice:integer date:datetime

サンプル用のデータの定義を「db/seeds.rb」に追加します。

Invoice.create(billno: 'WS-DF502', slipno:'GB465', customerid:'1', customername:'長崎カントリーフーズ', products: 'コーヒー 250 ml', number: '100', unitprice: '100', date:'2022-01-05T00:00:00')
Invoice.create(billno: 'WS-DF502', slipno:'GB465', customerid:'1', customername:'長崎カントリーフーズ', products: '紅茶 350 ml', number: '300', unitprice: '120', date:'2022-01-05T00:00:00')
Invoice.create(billno: 'WS-DF502', slipno:'DK055', customerid:'1', customername:'長崎カントリーフーズ', products: '炭酸飲料 (オレンジ) 350 ml', number: '200', unitprice: '120', date:'2022-01-09T00:00:00')

以下のコマンドを実行して、マイグレーションファイルの内容をデータベースに登録します。

rails db:migrate

以下のコマンドを実行して、シードファイルからデータを登録します。

rails db:seed

データの確認

以下のコマンドを実行してRailsのデータベースコンソールを起動します。

rails dbconsole

コンソールが起動したら、以下のSQLを実行して登録したデータを確認します。

select * from invoices;
SQLiteに登録されたデータの確認

Web APIの作成

データベースの設定が完了したら、次はWeb APIを作成していきます。「config/routes.rb」を以下のように修正し、ルーティングの設定を行います。

Rails.application.routes.draw do
  mount API => '/'
end

このままだと、「API」の文字が「Api」に変換され、ルーティングに失敗してしまうので、「config/initializers/inflections.rb」に以下の設定を追加して変換されないようにします。

ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.acronym 'API'
end

「app」フォルダ配下に「api」フォルダを作成し、「api.rb」ファイルを以下の内容で追加します。

class API < Grape::API
  prefix 'api'
  mount Resources::V1::Root
end

「api」フォルダ配下に「resources」フォルダを作成し、さらにその配下に「V1」フォルダを作成します。

そして「V1」フォルダ配下に「root.rb」ファイルを追加し以下の内容を設定します。

module Resources
  module V1
    class Root < Grape::API
      version 'v1'
      format :json
      content_type :json, 'application/json'
  
      mount Resources::V1::Invoices
    end
  end
end

同じく「V1」フォルダ配下に「invoices.rb」を作成し、以下のように参照、登録、更新、削除の処理を記述します。

module Resources
    module V1
      class Invoices < Grape::API
        resource :invoices do
          desc 'Return an invoice data.'
          get do
            present Invoice.all
          end

          desc 'Return all invoice data.'
          params do
            requires :id, type: Integer, desc: 'invoice id.'
          end
          get ':id' do
            present Invoice.find(params[:id])
          end

          desc 'Create an invoice data.'
          params do
            requires :billno, type: String, desc: 'bill no of invoice'
            requires :slipno, type: String, desc: 'slip no of invoice'
            requires :customerid, type: String, desc: 'customer id'
            requires :customername, type: String, desc: 'customer name'
            requires :products, type: String, desc: 'products name'
            requires :number, type: Integer, desc: 'number of products'
            requires :unitprice, type: Integer, desc: 'unitprice of products'
            requires :date, type: DateTime, desc: 'date of invoice'
          end
          post do
            Invoice.create({
                billno: params[:billno],
                slipno: params[:slipno],
                customerid: params[:customerid],
                customername: params[:customername],
                products: params[:products],
                number: params[:number],
                unitprice: params[:unitprice],
                date: params[:date]
            })
          end
    
          desc 'Update an invoice data.'
          params do
            requires :id, type: String, desc: 'invoice id.'
          end
          put ':id' do
            Invoice.find(params[:id]).update({
                billno: params[:billno],
                slipno: params[:slipno],
                customerid: params[:customerid],
                customername: params[:customername],
                products: params[:products],
                number: params[:number],
                unitprice: params[:unitprice],
                date: params[:date]
            })
          end

          desc 'Delete an invoice data.'
          params do
            requires :id, type: String, desc: 'invoice id.'
          end
          delete ':id' do
            Invoice.find(params[:id]).destroy
          end

        end
      end
    end
  end

最終的な「app」フォルダ配下の構成は以下のようになります。

appフォルダ配下の構成

CORSの設定

異なるドメインからAPIを実行する場合を想定して、CORSを有効化します。 「Gemfile」をエディタで開き、以下を追記します。

gem 'rack-cors', :require => 'rack/cors'

以下のコマンドを実行してインストールを行います。

bundle install

「config/application.rb」に以下の設定を追加します。

・・・(中略)
module Myapp
  class Application < Rails::Application
    config.load_defaults 7.0
    config.middleware.use Rack::Cors do
      allow do
        origins "*"
        resource "*", headers: :any, methods: [:get, :post, :put, :delete, :options]
      end
    end
  end
end

Web APIの実行

あとは実際にWeb APIを実行して動作を確認します。以下のコマンドを実行し、APIを起動します。

rails server

APIを起動したら、Postmanなどのツールを使用してリクエストを送信し、テストしてみます。

GET(参照)

http://127.0.0.1:3000/api/v1/invoices」に対してGETリクエストを実行し、先ほど登録したデータが返却されます。

POST(登録)

http://127.0.0.1:3000/api/v1/invoices」に対して POSTリクエストを実行します。以下のJSONをBodyに追加して実行します。

{
    "billno": "WS-DF502",
    "slipno": "YJ215",
    "customerid": "1",
    "customername": "長崎カントリーフーズ",
    "products": "ピリピリ ビール",
    "number": 80,
    "unitprice": 100,
    "date": "2022-01-12T00:00:00"
}

PUT(更新)

http://127.0.0.1:3000/api/v1/invoices/4」に対して PUTリクエストを実行します。以下のJSONをBodyに追加し、各項目を更新します。また、実行後に 「http://127.0.0.1:3000/api/v1/invoices/4」に対して GETリクエストも実行し、更新されたデータを確認します。

{
    "billno": "WS-DF502-Upd",
    "slipno": "YJ215-Upd",
    "customerid": "999",
    "customername": "長崎カントリーフーズ-Upd",
    "products": "ピリピリ ビール-Upd",
    "number": 999,
    "unitprice": 999,
    "date": "2022-12-31T00:00:00"
}

DELETE(削除)

http://127.0.0.1:3000/api/v1/invoices/4」 に対してDELETEリクエストを実行し、先ほど登録したデータを削除します。

おわりに

以上がRuby on RailsでWeb APIを実装する方法でした。次回はこのAPIと弊社のJavaScriptライブラリの連携方法についてご紹介したいと思います。

グレープシティでは、Ruby on Railsとも連携可能な、業務システム開発で使えるJavaScriptライブラリを提供しています。詳しくは以下のページをご覧ください。