Web API 四方山話
Ginzarb 第27回 / @y-yagi
今からお話すること
- Railsで作ったWebサービスにAPIを追加した時のはなし
- 趣味でやってる旅行計画用のWebサービス(Rails)があった
- 後からAndroidアプリを作成し、そこと連携する為にWebAPIを作った
構成
- 別のRailsアプリにはせず、元々あったWebサービスにそのままAPIを加えた
- model部分をRails Engineに載せて別アプリにする、という事も考えたが、作ってるのが一人なので、あまりメリットが無い気がしてやめた
- 複数人で開発して、API / Webサービスを作る人が別なら、modelをRails Engineにのせちゃうのはありかも? と思っている
- Rails Engine、あまり知らない人もいるかも?
余談
- そもそもRails(Ruby)という選択肢も考えた
- 既存のmodelの流用出来るのが楽だったので結局Railsにした
- 本当にアクセスが多いAPIだと、Goの方が性能出て良さそうな印象あります
構成
- model / controller それぞれにapiディレクトリをきって、APIに関するファイルはそこにまとめている
使用しているgem
- cookpadさんのgarageを使っている
- 認証部分はdoorkeeperを使用
- APIを開発した時点で、garageの認証処理にはdoorkeeperが必須だった為(今は違う)
garage
-
responseはクラスで定義する
class Employee < ActiveRecord::Base
include Garage::Representer
belongs_to :division
has_many :projects
property :id
property :title
property :division, selectable: true
collection :projects, selectable: true
link(:division) { division_path(division) }
link(:projects) { employee_projects_path(self) }
def self.build_permissions(perms, other, target)
perms.permits! :read
end
end
- active_model_serializers っぽさある
garage
-
アクセス制御はinitializerで定義出来る
Garage::TokenScope.configure do
register :public, desc: "accessing publicly available data" do
access :read, Recipe
end
register :read_post, desc: "reading blog post" do
access :read, Post
end
end
garage感想(1)
- 慣れれば便利だが、慣れるまで大変
- 情報源が、先のブログとREADME位しか無い
- 使ってる人あんまりいない?
- 細かい使い方を調べるにはソース読むしか無い
- 認証部分とJSONのレスポンスをまとめて管理出来るのは楽です
garage感想(2)
- gemとしてリリースされてない
- github指定でインストール
- bundle updateでバージョンアップ出来ないのが地味にめんどい
- tag指定すればバージョン固定はできるが…
テスト
- modelは元々のWebサービスのmodelの機能を大分そのまま使用しているので、API向けにそんなにテストは追加していない
- APIのテストはcontrollerのテストで書いている
まとめ
- 既存のWebサービスにAPIを追加した事についてお話しました
- garage、使われているという話をあまり聞いた事無いのですが、慣れると便利なので、APIをどうするか迷われている方がいらっしゃたらとりあえず試してみるのも良いかもです
聞いてみたい事
- gemなに使われているか
- スマホアプリと連携する際の認証をどうされているかほんのり聞いてみたい
- Webサーバ側の認証をoauthだけでやってる場合に、ユーザ認証を何で行っているか
- ページングを行うAPIをどう実装しているのか
- データ件数がアクティブに増えるサービスだと、一回とって、次データとる間に件数変わったり?
Web API 四方山話
Ginzarb 第27回 / @y-yagi