$30 off During Our Annual Pro Sale. View Details »

意図せぬレスポンスを防ぐAPI設計2つのコツ / Startup Rails #6

taogawa
July 18, 2017

意図せぬレスポンスを防ぐAPI設計2つのコツ / Startup Rails #6

2017/7/18「第6回スタートアップRails勉強会」での発表スライドです

taogawa

July 18, 2017
Tweet

More Decks by taogawa

Other Decks in Programming

Transcript

  1. ҙਤͤ͵ϨεϙϯεΛ
    ๷͙APIઃܭ2ͭͷίπ
    2017/7/18 taogawa

    View Slide

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

    View Slide

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

    View Slide

  4. TechBlog΋΍ͬͯ·͢
    http://tech.kitchhike.com/
    ʮDHHྲྀͷϧʔςΟϯάͰಘΒΕΔϝϦοτͱɺऔΓೖΕΔ্ͰͷϙΠϯτʯ
    ͱ͍͏هࣄΛॻ͖·ͨ͠

    View Slide

  5. API։ൃʹ
    ͖ͭ·ͱ͏໰୊

    View Slide

  6. ʮҙਤͤ͵Ϩεϙϯεʯ
    Λ๷͙ϙΠϯτ

    View Slide

  7. render json: @user.as_json
    # => response
    # {
    # "id": 1,
    # "first_name": "hike",
    # "last_name": "kitch",
    # ...
    # "password_digest": "xxxxxxxxx" # !!!!!
    # }

    View Slide

  8. ҙਤͤ͵Ϩεϙϯε
    • ϢʔβʔຊਓͷΈݟΕΔ΂͖ඇެ։৘ใΛϨ
    εϙϯεͰฦ͍ͯ͠Δ
    • Ծʹඇެ։APIͰ͋ͬͯ΋ΫϥΠΞϯτʹσʔ
    λ͕౉ΔͨΊɺආ͚ͳͯ͘͸͍͚ͳ͍
    • ҰํͰͪΐͬͱͨ͠ϛεʹΑΔόά͕ೖΓࠐ
    Έ΍͍͢

    View Slide

  9. ҙਤͤ͵ϨεϙϯεΛ
    ઃܭϨϕϧͰ๷͙

    View Slide

  10. 1.
    Ϩεϙϯε߲໨͸
    ϗϫΠτϦετํࣜ

    View Slide

  11. ϒϥοΫϦετํࣜΛࢭΊΑ͏
    • ϒϥοΫϦετํࣜ͸ϛεΛ͠΍͍͢
    • ͍ͭͷ·ʹ͔ΧϥϜ͕ՃΘͬͨ
    • ϒϥοΫϦετ΁ͷ෇͚Ճ͑࿙Ε
    • ۩ମతʹݴ͑͹ as_json ͸ࢭΊͨ΄͏͕͍͍
    Ͱ͢

    View Slide

  12. before
    render json: @user.as_json
    # => response
    # {
    # "id": 1,
    # "first_name": "hike",
    # "last_name": "kitch",
    # ...
    # }
    • as_json͸σϑΥϧτͰશͯͷ߲໨Λฦ͢ͷͰ
    ਏ͍ɾɾɾ

    View Slide

  13. ϗϫΠτϦετํࣜʹ͠Α͏
    • ϨεϙϯεͰฦ͢΂͖߲໨Λ໌จԽ͢Δ
    • ॻ͔ͳ͍߲໨͸Ϩεϙϯεʹؚ·Εͳ͍
    • ActiveModelSerializer, Jbuilder
    • as_json ͕ආ͚ΒΕͳͯ͘΋ɺͤΊͯonlyࢦఆ
    Λ͠Α͏

    View Slide

  14. after
    class UserSerializer < ActiveModel::Serializer
    attributes :id, :full_name
    def full_name
    "#{object.first_name} #{object.last_name}"
    end
    end
    # => response
    # {
    # "id": 1,
    # "full_name": "hike kitch"
    # }

    View Slide

  15. 2.
    Ϣʔβʔࣗ਎/ͦΕҎ֎ͷ
    Ϧιʔε͸ΤϯυϙΠϯτΛ
    ෼͚Δ

    View Slide

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

    View Slide

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

    View Slide

  18. ͍ͬͦΤϯυϙΠϯτΛ
    ෼͚Α͏
    • ΫΤϦύϥϝʔλͰͷ৚݅෼ذͰ͸ͳ͘ɺί
    ϯτϩʔϥࣗମΛ෼͚Δ
    • ϓϥΠϕʔτϦιʔε͸selfͷωʔϜεϖʔε
    ഑ԼʹҰݩԽ

    View Slide

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

    View Slide

  20. ΤϯυϙΠϯτ෼ׂͷϝϦοτ
    • ৚݅෼ذͷϛεͷ৺഑Λͳͤͨ͘
    • ҆৺ײ͕ͱͯ΋େ͖͍
    • ͜ͷΤϯυϙΠϯτ͸ɺ͜ͷϨεϙϯεɺͷ
    ੾Γ෼͚͕͸͖ͬΓͨ͠
    • ։ൃऀͷೝࣝҧ͍Λͳͤͨ͘

    View Slide

  21. ΤϯυϙΠϯτ෼ׂͷσϝϦο
    τ
    • ౰વAPIίʔϧ਺͸૿͑Δ
    • N+1ʹ͸ͳΒͳ͍ͷͰڐ༰͍ͯ͠Δ
    • ෼ׂͨ͠ίϯτϩʔϥͰͷίʔυͷॏෳ͕ى
    ͜Γ΍͍͢
    • Ϟσϧ૚ʹίʔυΛدͤͯରԠ

    View Slide

  22. ·ͱΊ
    • ҙਤͤ͵ϨεϙϯεΛฦ͞ͳ͍ઃܭ2ͭͷίπ
    • Ϩεϙϯε͸ϗϫΠτϦετํࣜʹ͢Δ
    • ৚݅෼ذΑΓΤϯυϙΠϯτͷ෼ׂ

    View Slide

  23. We’re Hiring!

    View Slide