emolog

脳内メモです。

railsでgrapeAPIを使ってみた

grape apiを使ってみたので導入メモ

現職でプロダクトのreplaceをすることになったので、rubyAPIフレームワークのgrapeを使ってみたのでメモです。 f:id:ababababa0222:20200331223716p:plain

github.com

背景

grapeを使う様になった経緯としては

  • 基本的にrailsAPIサーバとしての振る舞いしかもたない(railsでhtml生成しない / frontのvueに対してのAPIサーバ)
  • 既存はrails + jbuilderjsonを返却する感じだったがjbuilder微妙なのでやめたい
  • 実際に使っていたメンバーがチームにいた(よかったらしい)
  • railsに慣れているメンバーが多いのでrubyでいきたいが、通常のrailsよりシンプルなAPIにしたい
  • restAPI専用のライブラリのgrapeは割と評判良さそうだしつかってもいいかも

みたいなことを考えてgrapeAPIを選択しました。 特徴とか細かいことはまだこれからですが導入のログです。

やること

  • とりあえずgetきてresponseが変えるようにする
  • /api/hello とかでresponseが返却される
  • こんな階層にしてみました
├── app
    └── api
        ├── base.rb
        └── client
            └── hello.rb
  • baseでclient/hello.rbをmountする
  • helloでgetができようにする

導入

# 適宜optionは読み替えてくだい
$ rails new grape_sample --database=mysql --skip-test --skip-turbolinks
$ rails -v
  • Gemfile
gem 'grape'
gem 'grape-entity'
$ bundle install
  • base.rb
class Base < Grape::API
  format :json
  prefix :api

  mount Client::Hello
end 
  • routes.rbでbaseをmountする
Rails.application.routes.draw do
  mount Base => '/'
end
  • apis配下を読めるようにする
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0

    # ここを追加
    # app/apis 配下の.rbファイル読み込み対象にする
    config.paths.add File.join('app','apis'), glob: File.join('**', '*.rb')
    config.autoload_paths += Dir[Rails.root.join('app', 'apis', '*')]
  end
ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.acronym 'API'
end
  • responseを定義
module Client
  class Hello < Grape::API
    resource :hello do
      get do
        present :message, 'おけまる'
      end
    end
  end
end   
  • localの定義したendpointを叩いてみる

f:id:ababababa0222:20200331225343p:plain

おけまるでした🙆‍♀️ やってみたコードは↓ github.com

おわり