Ruby on Railsを使ってノンコーディングでAPIサーバーを作るのRails::APIを使ったバリエーションです。
前提
- ページングを扱いません
- モデルの関連を扱いません
- Ubuntu 14.04
- Ruby 2.2.5
- Rails 4.2.6
- Rails::API 0.4.0
- MySQL 5.7
準備
OttoでRubyアプリケーション向けの環境を作りました。
ライブラリ類はだいたい入っている前提です。
アプリケーションを作る前は、MySQLで必要なライブラリが入らないので
sudo apt-get install libmysqlclient-dev
を実行します。
Ottoの環境の作り方はottoで構築する環境のubuntuのバージョンを上げるを見てください。
今日の時点では割と高いハードルです。
手順
Railsを直接使うのと比べると
- config/application.rb編集
- protect_from_forgeryの無効化
が、なくなります。
Rails::APIをインストール
gem install rails-api
Railsアプリケーションを作成
rails-api new battle_beast -BJTS -d mysql
オプションで次の指定をします。
- bundle installを行わない
- javascriptを組み込まない
- test::unitを組み込まない
- sprocketsを組み込まない
- データベースの種類にmysqlを指定
Gemfile編集
使わない
- spring
を消します。
source 'https://rubygems.org'
gem 'rails', '4.2.6'
gem 'rails-api'
gem 'mysql2'
bundle install
bundle install --without staging production --jobs=4
scaffold
bundle exec rails generate scaffold User name:string
config/database.ymlを修正
username: root
password: root
host: mysql.service.consul
DB作成
rake db:create
rake db:migrate
起動
rackupコマンドが入っていないので、railsコマンドから起動します。
bundle exec rails s -b 0.0.0.0 -p 9292
動作確認
IPアドレスはVirtualBox上の仮想環境のIPアドレスです。
各自の環境に合わせて、適当に読み替えてください。
POST
curl -XPOST 'http://100.92.136.162:9292/users' -H content-type:application/json -d '{
"user": {"name": "桂歌丸"}
}'
送信するデータにキーuserが必要です。
生成されたuser_controller.rb
がStrong Parametersを使っています。
def user_params
params.require(:user).permit(:name)
end
» Rails4 の Strong Parameters でリクエストパラメータを検証する TECHSCORE BLOG
「params.require(:user).permit(:name, :email)」となっています。
このコードは「params が :user というキーを持ち、params[:user] は :name 及び :email というキーを持つハッシュであること」を検証します。
GET
curl 'http://100.92.136.162:9292/users'
レスポンスは
[{"id":1,"name":"桂歌丸","created_at":"2016-05-04T12:55:05.000Z","updated_at":"2016-05-04T12:55:05.000Z"}]
です。
PUT
curl -XPUT 'http://100.92.136.162:9292/users/1' -H content-type:application/json -d '{
"user": {"name": "イチロー"}
}'
DELETE
curl -XDELETE 'http://100.92.136.162:9292/users/1'
感想
使い勝手は、Railsコマンドとほとんど変わりません。
設定手順が減る分、楽です。
jsonの形式が変わるのが、要件によっては気になるかもしれません。
特に設定なしでGETするURLがブラウザで開けます。便利です。
例外時のレスポンスがhtmlなのはイマイチでした。