presen_ginzarb_27



presen_ginzarb_27

0 0


presen_ginzarb_27


On Github y-yagi / presen_ginzarb_27

Web API 四方山話

Ginzarb 第27回 / @y-yagi

今からお話すること

  • Railsで作ったWebサービスにAPIを追加した時のはなし
  • 趣味でやってる旅行計画用のWebサービス(Rails)があった
  • 後からAndroidアプリを作成し、そこと連携する為にWebAPIを作った

APIの構成について

構成

  • 別のRailsアプリにはせず、元々あったWebサービスにそのままAPIを加えた
  • model部分をRails Engineに載せて別アプリにする、という事も考えたが、作ってるのが一人なので、あまりメリットが無い気がしてやめた
    • 複数人で開発して、API / Webサービスを作る人が別なら、modelをRails Engineにのせちゃうのはありかも? と思っている
    • Rails Engine、あまり知らない人もいるかも?

余談

  • そもそもRails(Ruby)という選択肢も考えた
    • 考えたのはGo / Elixir
  • 既存のmodelの流用出来るのが楽だったので結局Railsにした
  • 本当にアクセスが多いAPIだと、Goの方が性能出て良さそうな印象あります

構成

  • model / controller それぞれにapiディレクトリをきって、APIに関するファイルはそこにまとめている

構成

  • routes.rbも分けてる

APIのバージョニング

  • urlにバージョンを含んでいる
    namespace :api do
      namespace :v1 do
          resources :travels, only: %i(index show)
          resources :places, only: %i(index)
      end
    end
    
  • よくあるやつ
  • 非互換が発生した場合、随時バージョン変えてる

gemについて

使用しているgem

garageを使用した理由

  • 認証が必須だったのだが、認証部分を0から作るのが面倒だった
  • RESTful Web API 開発をささえる Garage - クックパッド開発者ブログ
    既存の Rails アプリケーションに組み込んで Web API を実装する場合でも使用できます。
    Garage はリソースのシリアライズやアクセスコントロールなど
    Web API の実装に必要な機能をカバーしています。
    
  • とあって、良さそうかも? と思って使った

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のテストで書いている

テスト

  • Rails標準のテスト機構を使用している

まとめ

  • 既存のWebサービスにAPIを追加した事についてお話しました
  • garage、使われているという話をあまり聞いた事無いのですが、慣れると便利なので、APIをどうするか迷われている方がいらっしゃたらとりあえず試してみるのも良いかもです

聞いてみたい事

  • gemなに使われているか
    • 特に認証周りになに使われているか気になっています
  • スマホアプリと連携する際の認証をどうされているかほんのり聞いてみたい
    • Webサーバ側の認証をoauthだけでやってる場合に、ユーザ認証を何で行っているか
  • ページングを行うAPIをどう実装しているのか
    • データ件数がアクティブに増えるサービスだと、一回とって、次データとる間に件数変わったり?

参考文献

end

Web API 四方山話 Ginzarb 第27回 / @y-yagi