railsでgrapeAPIを使ってみた
grape apiを使ってみたので導入メモ
現職でプロダクトのreplaceをすることになったので、rubyのAPIフレームワークのgrapeを使ってみたのでメモです。
背景
grapeを使う様になった経緯としては
- 基本的にrailsはAPIサーバとしての振る舞いしかもたない(railsでhtml生成しない / frontのvueに対してのAPIサーバ)
- 既存はrails + jbuilderでjsonを返却する感じだったが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
- config/initializers/inflections.rb
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を叩いてみる
おけまるでした🙆♀️ やってみたコードは↓ github.com
おわり