coding, photo, plant and demo

*Rails4 + Grape + MySQLでお手軽REST APIサーバ

tech 20140831 190632

はじめに

Ruby on Rails 4を使ってRESTfulなAPIサーバを作ってみます。RoRを触るのは数年ぶりなのでググりながらやってみた結果のメモとなります。

環境

そもそも新しいrubyが入っていなかったので入れます。rvmというのが便利らしい。nodeでいうnvmやnodebrewですね。
uname -a                                                                                                                             Linux mnu13 3.8.0-19-generic #29-Ubuntu SMP Wed Apr 17 18:16:28 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

curl -sSL https://get.rvm.io | bash -s stable
source ~/.bash_profile
rvm install 2.1
rvm use 2.1

ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]

gem -v
2.2.2

あと、mysqlを入れておきます。
sudo apt-get install mysql-server mysql-client libmysqlclient-dev
rootのパスワードはrootとしました。
よし、下準備ができました。

Railsで雛形の作成

railsのgemを入れます。
gem install rails
rails -v                                                                                                                    Rails 4.1.5

restserverという名前のプロジェクトを新しく作ります。
rails new restserver -d mysql

色々ファイルが生成されました。
mysqlのrootのパスワードを設定する必要があります。
cd restserver
vi config/database.yml
:s/password:/password: root/
ZZ

DBを作ります。
bin/rake db:create db:migrate

適当なmodelを作ってDBをmigrateします。今回はありがちですがメモアプリということで、タイトルと中身と作者を記録します。
bundle exec rails generate scaffold memo title:string author:string body:text
bin/rake db:migrate 

サーバを起動します。
bin/rails server

http://localhost:3000/memos
にアクセスすれば、既に簡単なメモアプリが完成しています。

あ、ありのまま今起こったことを話すぜ、railsをinstallして数回CUIを叩いたらメモアプリが出来ていた…jsとかhtmlとかsqlとかそんなチャチなものじゃない、もっと恐ろしいものの片鱗を味わったぜ… (みんな知ってるから!)

Grapeを使ったRESTful APIの追加

REST APIを追加するにはgrapeというgemが良いらしい。
http://intridea.github.io/grape/docs

Gemfileに
gem 'grape'
を追加。
bundle install

app/api/api.rbを新規作成。versionごとに分けることを見据えておきます。
require 'api_v1.rb'

module API
  class Base < Grape::API
    mount API::V1
  end
end

app/api/api_v1.rbを新規作成。
module API
  class V1 < Grape::API
    prefix 'v1'
    format :json

    get :hello do
      { text:'hello' }
    end

    resource :memos do
      get do
        Memo.all
      end

      get ':id' do
          Memo.find(params[:id])
      end

      post do
        Memo.create(
          :title => params[:title],
          :body => params[:body],
          :author => params[:author]
        )
      end
    end
  end
end

config/routes.rbに下記を追加。
  mount API::Base => '/api'

config/application.rbに下記を追加。
   config.paths.add "app/api", glob: "**/*.rb"
   config.autoload_paths += Dir["#{Rails.root}/app/api/*"]

動作確認

curl -X POST -H "Content-Type: application/json" -d '{"title":"ramen","author":"mtm","body":"jiro saiko"}' http://localhost:3000/api/v1/memos
curl http://localhost:3000/api/v1/memos
curl http://localhost:3000/api/v1/memos/1
等としてAPIが機能していることを確かめましょう。

今回ここに書いたものは非常に初歩的な例なので、より高度な使い方はgrapeのドキュメントや下記を参照してください。

参考文献

RailsとGrapeで行う最高のWeb API開発
http://qiita.com/anoworl/items/756f01cc3d188ebad139
テストの仕方も含めてやり方が書いてあります。

Grape - RailsでスピーディにAPIを作成!
http://morizyun.github.io/blog/rails-grepe-api-heroku-ruby
twitterぽいAPIの作り方。requireのあたり参考になります。

https://github.com/bloudraak/grape-sample-blog-api
Rails3でgrape使ってAPI付きブログのサンプルを作ってみたよ、というレポジトリ。

簡単インストールから始める初心者のためのRuby on Railsチュートリアル (1/3)
http://www.atmarkit.co.jp/ait/articles/1402/28/news047.html
そもそもRoRってどうやって使うんだっけ、と思って最初にこれを見ました。