Upgrade to Pro — share decks privately, control downloads, hide ads and more …

おいしい時間を支えるAPI設計 / Food Service Engineers Meetup #3

taogawa
June 14, 2017

おいしい時間を支えるAPI設計 / Food Service Engineers Meetup #3

2017/6/14 「Food Service Engineers Meetup #3 〜メキシカンナイト〜」での発表スライドです

taogawa

June 14, 2017
Tweet

More Decks by taogawa

Other Decks in Programming

Transcript

  1. ͓͍͍࣌ؒ͠Λࢧ͑Δ
    APIઃܭ
    2017/6/14 taogawa

    View Slide

  2. ࣗݾ঺հ
    • גࣜձࣾΩονϋΠΫ ΤϯδχΞ
    • খ઒ ߶ (taogawa)
    • αʔόʔαΠυΛओʹ୲౰͍ͯ͠·͢ɻ

    View Slide

  3. ྉཧΛͭ͘Δਓͱ৯΂ΔਓͷަྲྀίϛϡχςΟαΠτ
    KitchHike
    https://kitchhike.com/

    View Slide

  4. ΦϑΟεKitchHike
    ͸͡Ί·ͨ͠
    http://www.office-kitchhike.com/

    View Slide

  5. ຊ೔͓࿩͢Δ͜ͱ
    • ࣗࣾͷϞόΠϧΞϓϦ༻APIΛ։ൃ͢Δʹ͋ͨ
    ͍ͬͯΖ͍Ζߟ͑ͨઃܭϙΠϯτʹ͍ͭͯ

    View Slide

  6. ϞόΠϧΞϓϦϦϦʔε༧ఆ
    • 8݄ʹϦϦʔε༧ఆ
    • ReactNativeͰ։ൃ

    View Slide

  7. API։ൃͰղܾ͔ͨͬͨ͠՝୊
    • ௨৴ίετͷ໰୊
    • ηΩϡϦςΟͷ໰୊

    View Slide

  8. ՝୊ᶃ
    ௨৴ίετͷ໰୊

    View Slide

  9. ௨৴ͷίετ͕໰୊ʹͳΔͱ͖
    • ௨৴ճ਺͕ଟ͍
    • ௨৴ྔ͕ଟ͍

    View Slide

  10. ௨৴ճ਺͕ଟ͍
    • ΍ͨΒͱAPIίʔϧ͕ଟ͍
    • ୯७ͳϞσϧͷϨεϙϯεͩͱى͜Γ͕ͪ
    • ϦϨʔγϣϯͷࢀর͕ id ͚ͩ
    • ؔ࿈͢ΔϞσϧͷσʔλͷऔಘʹAPIίʔϧ

    View Slide

  11. • Pop−UpΠϕϯτ
    • 2ͭͷϦϨʔγϣϯ
    • ྉཧΛ;Δ·͏Ϣʔ
    βʔ(COOK)
    • Πϕϯτग़੮ऀ

    View Slide

  12. ௨৴ྔ͕ଟ͍
    • Ϩεϙϯεʹෆඞཁͳ৘ใ͕ଟ͍
    • ͪ͜Β΋୯७ͳϞσϧͷϨεϙϯεͩͱى͜Γ͕ͪ
    • ը໘Ͱඞཁͳ߲໨͸ͦͷ಺2ɺ3߲໨ͳͷʹɺ਺े߲
    ໨͕ฦͬͯ͘Δ
    • ެ։APIͳΒ͍͍͔΋͠Εͳ͍͕ɺࣗࣾΞϓϦ޲͚
    APIͰ͸໌Β͔ʹ৑௕

    View Slide

  13. ෆඞཁͳ߲໨͕ଟ͍
    render json: @user.as_json
    # => response
    # {
    # "id": 1,
    # "first_name": "hike",
    # "last_name": "kitch",
    # ...ͨ͘͞Μͷ߲໨͕ଓ͘
    # }
    • ཉ͍͠ͷ͸idͱ໊લ͚ͩͳͷʹɾɾɾ

    View Slide

  14. ՝୊ᶄ
    ηΩϡϦςΟͷ໰୊

    View Slide

  15. ηΩϡϦςΟ্ͷݒ೦
    • ࣗࣾΞϓϦͱ͸͍͑ɺJSONܗࣜͰΫϥΠΞϯ
    τʹσʔλ͕౉Δ
    • HTMLϏϡʔͷϨϯμϦϯάͱҟͳΓɺ͏͔ͭ
    ͳϨεϙϯε͸ฦͤͳ͍
    • User ϞσϧΛͦͷ··ϨεϙϯεͰฦ͢ ->
    ύεϫʔυμΠδΣετؚ͕·Ε͍ͯͨ

    View Slide

  16. ͜͜·Ͱͷ·ͱΊ
    • Ϩεϙϯε߲໨ͷա৒ / ෆ଍͸௨৴ίετͷ໰
    ୊ͷݪҼʹͳΓ͏Δ
    • APIͰ͸ϦιʔεΛͦͷ··ϨεϙϯεͰฦ͢
    ͱҙਤ͠ͳ͍΋ͷ·ͰΫϥΠΞϯτʹ౉ͬͯ
    ͠·͏

    View Slide

  17. ରࡦฤ

    View Slide

  18. Ͳ͏ͯ͜͠ͷ໰୊͕ى͖Δͷ͔
    • ӬଓԽ૚ͷσʔλߏ଄ͱɺAPIͰฦ͍ͨ͠σʔ
    λߏ଄͸Ұக͠ͳ͍͔Β

    View Slide

  19. ௨৴ίετରࡦ:
    ઃܭͰ௨৴ίετΛݮΒ͢

    View Slide

  20. Ͳ͏ແବͳ௨৴Λආ͚Δ͔
    • Ҋ1: ը໘ͱ1ର1ʹͳΔΑ͏ͳઃܭ
    • ը໘ʹدͤΔ೿
    • Ҋ2: Ϧιʔε͝ͱͷΤϯυϙΠϯτ & ΫΤϦύϥ
    ϝʔλͰϦϨʔγϣϯΛऔಘͰ͖ΔΑ͏ͳઃܭɻ
    • ϦιʔεʹدͤΔ೿

    View Slide

  21. Altech/rails-restful-api
    https://github.com/Altech/rails-restful-api/
    blob/master/README.md
    Rails 5 Ͱ࡞Δ RESTful API ଎शձͷࢿྉ

    View Slide

  22. ݁ہͲ͏͔ͨ͠
    • 1.ͱ2.ͷதؒɻ
    • ը໘߲໨Λચ͍ग़ͯ͠ɺ࠷େެ໿਺ʹͳΔΑ
    ͏ͳΤϯυϙΠϯτΛ੾Δ
    • ։ൃϦιʔε΍ཁ݅Λ͍Ζ͍Ζߟ͑ͯɺฐࣾ
    ʹ͸͍ͪ͹Μίεύ͕ྑ͔ͬͨ

    View Slide

  23. ֤Ҋͷൺֱ
    ॊೈ͞ γϯϓϧ͞
    Ҋ ˚ ˕
    Ҋ ˕ ˚
    Ҋ,) ̋ ̋

    View Slide

  24. ηΩϡϦςΟ໰୊ରࡦ:
    ͏͔ͬΓηΩϡϦςΟϗʔϧ
    Λແ͘͢ઃܭ

    View Slide

  25. ۩ମతͳ࣮૷ํ਑
    • Ϩεϙϯε߲໨͸ϗϫΠτϦετํࣜ
    • Ϣʔβʔࣗ਎/ͦΕҎ֎ͷϦιʔε͸Τϯυϙ
    ΠϯτΛ෼͚Δ

    View Slide

  26. ηΩϡϦςΟ໰୊ରࡦ
    ͦͷ1:
    Ϩεϙϯε߲໨͸
    ϗϫΠτϦετํࣜ

    View Slide

  27. ѱ͍ྫ
    • ࢖ͬͯ͸͍͚ͳ͍ as_json
    render json: @user.as_json
    # => response
    # {
    # "id": 1,
    # "first_name": "hike",
    # "last_name": "kitch",
    # ...
    # "password_digest": "xxxxxxxxx" # !!!!!
    # }

    View Slide

  28. as_jsonͷ໰୊఺
    • σϑΥϧτͰ͸શͯͷ߲໨͕ग़ͯ͠·͏ɻ
    • جຊϒϥοΫϦετํࣜͳͷͰɺ আ֎ઃఆͷ
    ϛεͰϨεϙϯεʹؚ·Εͯ͠·͏

    View Slide

  29. ςϯϓϨʔτΤϯδϯ or
    SerializerΛ࢖͓͏
    • ςϯϓϨʔτΤϯδϯ
    • Rabl
    • jbuilder
    • Serializer
    • ActiveModelSerializer -> ฐࣾͰ͸͜ΕΛ࢖͍·
    ͨ͠

    View Slide

  30. ActiveModelSerializer
    class UserSerializer < ActiveModel::Serializer
    attributes :id, :full_name
    def full_name
    "#{object.first_name} #{object.last_name}"
    end
    end

    View Slide

  31. ༨ஊɿ
    ActiveModelSerializerͷ
    Α͍ͱ͜Ζ/Α͘ͳ͍ͱ͜Ζ

    View Slide

  32. Α͍ͱ͜Ζ
    • ςϯϓϨʔτΤϯδϯͱҧ͍RubyͷΫϥεͳͷͰ͍
    Ζ͍ΖͰ͖Δ
    • ந৅ԽͷςΫχοΫ͕৭ʑ࢖͑Δ(ϝιουԽɺϞ
    δϡʔϧԽ)
    • ϩδοΫ͕৭ʑॻ͚Δ
    • ςετॻ͖΍͍͢

    View Slide

  33. Α͘ͳ͍ͱ͜Ζ
    • جຊ 1Ϟσϧ-1γϦΞϥΠβΛ૝ఆ͍ͯ͠Δͬ
    Ά͍
    • ෳ਺Ϟσϧʹ·͕ͨΔΑ͏ͳγϦΞϥΠβΛ
    ॻ͜͏ͱ͢Δͱɺ్୺ʹॻ͖ͮΒ͘ͳΔ

    View Slide

  34. ηΩϡϦςΟ໰୊ରࡦ
    ͦͷ2:
    Ϣʔβʔࣗ਎/ͦΕҎ֎ͷ
    Ϧιʔε͸ΤϯυϙΠϯτΛ
    ෼͚Δ

    View Slide

  35. Α͋͘Δύλʔϯ
    • ύϥϝʔλͰϨεϙϯεΛग़͠෼͚Δ
    • Ϩεϙϯεͷग़͠෼͚ͷ৚݅൑ఆϛεɺ։ൃ
    ऀͷצҧ͍
    • ެ։Ϧιʔε͚ͩͷͭ΋Γ͕ϢʔβʔͷϓϥΠ
    ϕʔτϦιʔε΋ฦ͍ͯͨ͠

    View Slide

  36. before
    # /kitchens/:id?scope=self
    class KitchensController < ApplicationController
    def show
    if params[:scope] == "self"
    # ...
    else
    # ...
    end
    end
    end

    View Slide

  37. ରࡦ
    • ͍ͬͦΤϯυϙΠϯτΛ෼͚ͯ͠·͏
    • ϓϥΠϕʔτϦιʔε͸selfͷωʔϜεϖʔε
    ഑ԼʹҰݩԽ

    View Slide

  38. after
    # /kitchens/:id
    class KitchensController < ApplicationController
    def show
    end
    end
    # /self/kitchens/:id
    class Self::KitchensController < ApplicationController
    def show
    end
    end

    View Slide

  39. ΤϯυϙΠϯτ෼ׂͷϝϦοτ
    • όάʹΑΔ͏͔ͬΓϨεϙϯεϛε͸ͳ͘ͳͬ
    ͨ
    • ͜ͷΤϯυϙΠϯτ͸ɺ͜ͷϨεϙϯεɺͷ
    ੾Γ෼͚͕͸͖ͬΓͨ͠
    • ։ൃऀͷೝࣝҧ͍Λͳͤͨ͘

    View Slide

  40. ҰํσϝϦοτ͸໪࿦͋Δ
    • ౰વAPIίʔϧ਺͸૿͑Δ
    • N+1ʹ͸௚݁͠ͳ͍ͷͰɺࠓճ͸ڐ༰͍ͯ͠
    Δ
    • γϏΞͳύϑΥʔϚϯε͕ٻΊΒΕΔ৔߹
    ͸ɺ͜ͷݪଇΛ่͢ͷ΋ඞཁ͔΋

    View Slide

  41. ·ͱΊ
    • ແବͳ௨৴Λආ͚Δʹ͸
    • ԣணͤͣʹը໘ଆͷ߲໨ΛͪΌΜͱߟ͑ͯϨεϙϯε
    Λઃܭɾ࣮૷͠Α͏
    • ෆ༻ҙͳϨεϙϯεΛฦ͞ͳ͍ͨΊʹ͸
    • Ϩεϙϯε͸ϗϫΠτϦετํࣜ
    • ΤϯυϙΠϯτΛ෼͚Δͱ͖ͬ͢Γ͢ΔͷͰΦεεϝ

    View Slide

  42. We’re Hiring!

    View Slide