「Using Rails for API-only Applications — Ruby on Rails Guides」を中心に、Rails 5.0.0.beta2 API modeについて少し調べてみたのでそのメモです。
🐠 APIアプリケーションのおさらい
まず、ここではAPIアプリケーションを「GitHub Developer | GitHub Developer Guide」のように、プログラムがアクセスすることを前提としたWebアプリケーションと考えいます。
クライアントサイドにNativeアプリケーションがあり、バックエンドにRailsのアプリケーションがJSONのリソースを扱うことを想定しています。
🐰 なぜJSON APIにRailsを使うのか?
Railsが提供しているCoCのベストプラクティスを有効活用して、ビジネスロジックをスピーディかつ柔軟にAPIを構築できる点が、
RailsをAPIアプリケーションとして活用するメリットだと考えます。
🤔 Railsを使うメリット
- リクエストが来るたびに、変更内容を監視して最適なリロードが実行される(開発者のプロダクティビティを落とさない) - 開発モードを持ち、開発者のプロダクティビティを向上させる(本番モードのパフォーマンスは落とさない) - 環境情報やDBのクエリー、基本的なパフォーマンスなどのログを出力する - セキュリティがしっかりしている(IPスプーフィングや、Timing Attack等を防いでくれる) - URLパラメータだけでなく、JSONパラメータ等の解釈できる - 変更がない場合に304 Not Modifiedを返すConditional GETを使う事ができる(`#stale?`, ETag, Last-Modified) - Railsの強力なキャッシュ機能(page, action, fragment caching)を有効活用することができる - RESTful JSON APIを構築するのであればResourceful Routingは最適 - Basic認証、Digest認証、Token認証等の基本的な認証方法をサポートしている - シングルコマンドで、controller, model, routes, test stub等々を生成できる強力なジェネレータを持つ - 沢山のサードパーティのライブラリが、RailsによるWebアプリの構築をサポートしてくれる
🍄 新規のアプリケーションを構築する場合
次のように --api
オプションをつけるとAPIモードとして生成されます。
$ rails new my_api --api |
このコマンドによって生成されるRailsアプリケーションには次のような特徴があります。
- 通常のWebアプリよりも、Middlewareが少ないので応答性能が向上する - ApplicationController => ActionController::APIを継承する - GeneratorでのViewやAssetの生成が行われない(フロントエンド側が行うことを想定)
🐝 既存のアプリケーションをAPI Modeにする場合
configを次のように修正。
# config/application.rb |
# config/environments/development.rb |
各controllerを以下のように変更。
class ApplicationController < ActionController::Base |
🚜 APIモードのmiddleware
次のコマンドを実行するとrailsのmiddlewareをみることができます。
$ rails middleware |
ちなみに、APIモードのmiddlewareは次のとおりです。
Rack::Sendfile #=> X-Sendfile header をセットする |
🐯 Cache Middlewareの活用
HTTP Cacheの基本的な使い方は、controllerで #stale?
を使うだけです。
def show |
この方法は、If-Modified-Since
ヘッダに `@post.updated_at` をセットします。
最後の更新から変更がない場合は、「304 Not Modified」を返します。
🎂 Rack::Sendfileの活用
Rack::Sendfile
は、controllerで #send_file
メソッドを利用することで実際にファイルを送付できる。
このメソッドを使う場合は以下のような設定を行う必要がある。
# config/environemts/production.rb |
🗻 ActionDispatch::Requestの活用
jQuery.ajax({ |
もControllerで次のように正しく解釈される。
{ :person => { :firstName => "Yehuda", :lastName => "Katz" } } |
🐮 middlewareの追加・削除
# middlewareの追加 |
🐡 (補足) HTTP ETag
「HTTP ETag」はキャッシュの有効性を検証するためのしくみのひとつ。
🗽 参考リンク
- Rails on Rack — Ruby on Rails Guides
- Using Rails for API-only Applications — Ruby on Rails Guides
- rails-api/rails-api: Rails for API only applications
- Rails for API applications (rails-api) released
- #slate? - ActionController::ConditionalGet
- Gists | GitHub Developer Guide
- Digest認証 - Wikipedia