Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
おいしい時間を支えるAPI設計 / Food Service Engineers Meetup #3
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
taogawa
June 14, 2017
Programming
1
2.7k
おいしい時間を支えるAPI設計 / Food Service Engineers Meetup #3
2017/6/14 「Food Service Engineers Meetup #3 〜メキシカンナイト〜」での発表スライドです
taogawa
June 14, 2017
Tweet
Share
More Decks by taogawa
See All by taogawa
「一人でも多く、一円でも多く」 価値を届ける決済の仕組みと工夫 / 2022-11-30_10x_campfire_kanmu
taogawa
0
130
キッチハイク社内勉強会 ドメイン駆動設計のはなし / 2021-09-01
taogawa
0
1.6k
キッチハイク社内勉強会 / 2021-03-03
taogawa
0
1.1k
7年目を迎えたRails アプリケーションの傾向と対策/Rails Developers Meetup 2019 Day1
taogawa
8
4.2k
意図せぬレスポンスを防ぐAPI設計2つのコツ / Startup Rails #6
taogawa
0
2.7k
Other Decks in Programming
See All in Programming
AI時代の認知負荷との向き合い方
optfit
0
160
izumin5210のプロポーザルのネタ探し #tskaigi_msup
izumin5210
1
140
Apache Iceberg V3 and migration to V3
tomtanaka
0
170
FOSDEM 2026: STUNMESH-go: Building P2P WireGuard Mesh Without Self-Hosted Infrastructure
tjjh89017
0
180
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
2.5k
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
210
「ブロックテーマでは再現できない」は本当か?
inc2734
0
1k
MDN Web Docs に日本語翻訳でコントリビュート
ohmori_yusuke
0
660
AI巻き込み型コードレビューのススメ
nealle
2
1.3k
並行開発のためのコードレビュー
miyukiw
0
1.1k
生成AIを使ったコードレビューで定性的に品質カバー
chiilog
1
280
なるべく楽してバックエンドに型をつけたい!(楽とは言ってない)
hibiki_cube
0
140
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.4k
ラッコキーワード サービス紹介資料
rakko
1
2.3M
Building an army of robots
kneath
306
46k
Optimizing for Happiness
mojombo
379
71k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
1
100
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.9k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
120
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
200
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
The Cult of Friendly URLs
andyhume
79
6.8k
Transcript
͓͍͍࣌ؒ͠Λࢧ͑Δ APIઃܭ 2017/6/14 taogawa
ࣗݾհ • גࣜձࣾΩονϋΠΫ ΤϯδχΞ • খ ߶ (taogawa) • αʔόʔαΠυΛओʹ୲͍ͯ͠·͢ɻ
ྉཧΛͭ͘Δਓͱ৯ΔਓͷަྲྀίϛϡχςΟαΠτ KitchHike https://kitchhike.com/
ΦϑΟεKitchHike ͡Ί·ͨ͠ http://www.office-kitchhike.com/
ຊ͓͢Δ͜ͱ • ࣗࣾͷϞόΠϧΞϓϦ༻APIΛ։ൃ͢Δʹ͋ͨ ͍ͬͯΖ͍Ζߟ͑ͨઃܭϙΠϯτʹ͍ͭͯ
ϞόΠϧΞϓϦϦϦʔε༧ఆ • 8݄ʹϦϦʔε༧ఆ • ReactNativeͰ։ൃ
API։ൃͰղܾ͔ͨͬͨ͠՝ • ௨৴ίετͷ • ηΩϡϦςΟͷ
՝ᶃ ௨৴ίετͷ
௨৴ͷίετ͕ʹͳΔͱ͖ • ௨৴ճ͕ଟ͍ • ௨৴ྔ͕ଟ͍
௨৴ճ͕ଟ͍ • ͨΒͱAPIίʔϧ͕ଟ͍ • ୯७ͳϞσϧͷϨεϙϯεͩͱى͜Γ͕ͪ • ϦϨʔγϣϯͷࢀর͕ id ͚ͩ •
ؔ࿈͢ΔϞσϧͷσʔλͷऔಘʹAPIίʔϧ
• Pop−UpΠϕϯτ • 2ͭͷϦϨʔγϣϯ • ྉཧΛ;Δ·͏Ϣʔ βʔ(COOK) • Πϕϯτग़੮ऀ
௨৴ྔ͕ଟ͍ • Ϩεϙϯεʹෆඞཁͳใ͕ଟ͍ • ͪ͜Β୯७ͳϞσϧͷϨεϙϯεͩͱى͜Γ͕ͪ • ը໘Ͱඞཁͳ߲ͦͷ2ɺ3߲ͳͷʹɺे߲ ͕ฦͬͯ͘Δ • ެ։APIͳΒ͍͍͔͠Εͳ͍͕ɺࣗࣾΞϓϦ͚
APIͰ໌Β͔ʹ
ෆඞཁͳ߲͕ଟ͍ render json: @user.as_json # => response # { #
"id": 1, # "first_name": "hike", # "last_name": "kitch", # ...ͨ͘͞Μͷ߲͕ଓ͘ # } • ཉ͍͠ͷidͱ໊લ͚ͩͳͷʹɾɾɾ
՝ᶄ ηΩϡϦςΟͷ
ηΩϡϦςΟ্ͷݒ೦ • ࣗࣾΞϓϦͱ͍͑ɺJSONܗࣜͰΫϥΠΞϯ τʹσʔλ͕Δ • HTMLϏϡʔͷϨϯμϦϯάͱҟͳΓɺ͏͔ͭ ͳϨεϙϯεฦͤͳ͍ • User ϞσϧΛͦͷ··ϨεϙϯεͰฦ͢
-> ύεϫʔυμΠδΣετؚ͕·Ε͍ͯͨ
͜͜·Ͱͷ·ͱΊ • Ϩεϙϯε߲ͷա / ෆ௨৴ίετͷ ͷݪҼʹͳΓ͏Δ • APIͰϦιʔεΛͦͷ··ϨεϙϯεͰฦ͢ ͱҙਤ͠ͳ͍ͷ·ͰΫϥΠΞϯτʹͬͯ ͠·͏
ରࡦฤ
Ͳ͏ͯ͜͠ͷ͕ى͖Δͷ͔ • ӬଓԽͷσʔλߏͱɺAPIͰฦ͍ͨ͠σʔ λߏҰக͠ͳ͍͔Β
௨৴ίετରࡦ: ઃܭͰ௨৴ίετΛݮΒ͢
Ͳ͏ແବͳ௨৴Λආ͚Δ͔ • Ҋ1: ը໘ͱ1ର1ʹͳΔΑ͏ͳઃܭ • ը໘ʹدͤΔ • Ҋ2: Ϧιʔε͝ͱͷΤϯυϙΠϯτ &
ΫΤϦύϥ ϝʔλͰϦϨʔγϣϯΛऔಘͰ͖ΔΑ͏ͳઃܭɻ • ϦιʔεʹدͤΔ
Altech/rails-restful-api https://github.com/Altech/rails-restful-api/ blob/master/README.md Rails 5 Ͱ࡞Δ RESTful API शձͷࢿྉ
݁ہͲ͏͔ͨ͠ • 1.ͱ2.ͷதؒɻ • ը໘߲Λચ͍ग़ͯ͠ɺ࠷େެʹͳΔΑ ͏ͳΤϯυϙΠϯτΛΔ • ։ൃϦιʔεཁ݅Λ͍Ζ͍Ζߟ͑ͯɺฐࣾ ʹ͍ͪΜίεύ͕ྑ͔ͬͨ
֤Ҋͷൺֱ ॊೈ͞ γϯϓϧ͞ Ҋ ˚ ˕ Ҋ ˕ ˚ Ҋ,)
̋ ̋
ηΩϡϦςΟରࡦ: ͏͔ͬΓηΩϡϦςΟϗʔϧ Λແ͘͢ઃܭ
۩ମతͳ࣮ํ • Ϩεϙϯε߲ϗϫΠτϦετํࣜ • Ϣʔβʔࣗ/ͦΕҎ֎ͷϦιʔεΤϯυϙ ΠϯτΛ͚Δ
ηΩϡϦςΟରࡦ ͦͷ1: Ϩεϙϯε߲ ϗϫΠτϦετํࣜ
ѱ͍ྫ • ͍͚ͬͯͳ͍ as_json render json: @user.as_json # => response
# { # "id": 1, # "first_name": "hike", # "last_name": "kitch", # ... # "password_digest": "xxxxxxxxx" # !!!!! # }
as_jsonͷ • σϑΥϧτͰશͯͷ߲͕ग़ͯ͠·͏ɻ • جຊϒϥοΫϦετํࣜͳͷͰɺ আ֎ઃఆͷ ϛεͰϨεϙϯεʹؚ·Εͯ͠·͏
ςϯϓϨʔτΤϯδϯ or SerializerΛ͓͏ • ςϯϓϨʔτΤϯδϯ • Rabl • jbuilder •
Serializer • ActiveModelSerializer -> ฐࣾͰ͜ΕΛ͍· ͨ͠
ActiveModelSerializer class UserSerializer < ActiveModel::Serializer attributes :id, :full_name def full_name
"#{object.first_name} #{object.last_name}" end end
༨ஊɿ ActiveModelSerializerͷ Α͍ͱ͜Ζ/Α͘ͳ͍ͱ͜Ζ
Α͍ͱ͜Ζ • ςϯϓϨʔτΤϯδϯͱҧ͍RubyͷΫϥεͳͷͰ͍ Ζ͍ΖͰ͖Δ • நԽͷςΫχοΫ͕৭ʑ͑Δ(ϝιουԽɺϞ δϡʔϧԽ) • ϩδοΫ͕৭ʑॻ͚Δ •
ςετॻ͖͍͢
Α͘ͳ͍ͱ͜Ζ • جຊ 1Ϟσϧ-1γϦΞϥΠβΛఆ͍ͯ͠Δͬ Ά͍ • ෳϞσϧʹ·͕ͨΔΑ͏ͳγϦΞϥΠβΛ ॻ͜͏ͱ͢Δͱɺ్ʹॻ͖ͮΒ͘ͳΔ
ηΩϡϦςΟରࡦ ͦͷ2: Ϣʔβʔࣗ/ͦΕҎ֎ͷ ϦιʔεΤϯυϙΠϯτΛ ͚Δ
Α͋͘Δύλʔϯ • ύϥϝʔλͰϨεϙϯεΛग़͚͠Δ • Ϩεϙϯεͷग़͚͠ͷ݅ఆϛεɺ։ൃ ऀͷצҧ͍ • ެ։Ϧιʔε͚ͩͷͭΓ͕ϢʔβʔͷϓϥΠ ϕʔτϦιʔεฦ͍ͯͨ͠
before # /kitchens/:id?scope=self class KitchensController < ApplicationController def show if
params[:scope] == "self" # ... else # ... end end end
ରࡦ • ͍ͬͦΤϯυϙΠϯτΛ͚ͯ͠·͏ • ϓϥΠϕʔτϦιʔεselfͷωʔϜεϖʔε ԼʹҰݩԽ
after # /kitchens/:id class KitchensController < ApplicationController def show end
end # /self/kitchens/:id class Self::KitchensController < ApplicationController def show end end
ΤϯυϙΠϯτׂͷϝϦοτ • όάʹΑΔ͏͔ͬΓϨεϙϯεϛεͳ͘ͳͬ ͨ • ͜ͷΤϯυϙΠϯτɺ͜ͷϨεϙϯεɺͷ Γ͚͕͖ͬΓͨ͠ • ։ൃऀͷೝࣝҧ͍Λͳͤͨ͘
ҰํσϝϦοτ͋Δ • વAPIίʔϧ૿͑Δ • N+1ʹ݁͠ͳ͍ͷͰɺࠓճڐ༰͍ͯ͠ Δ • γϏΞͳύϑΥʔϚϯε͕ٻΊΒΕΔ߹ ɺ͜ͷݪଇΛ่͢ͷඞཁ͔
·ͱΊ • ແବͳ௨৴Λආ͚Δʹ • ԣணͤͣʹը໘ଆͷ߲ΛͪΌΜͱߟ͑ͯϨεϙϯε Λઃܭɾ࣮͠Α͏ • ෆ༻ҙͳϨεϙϯεΛฦ͞ͳ͍ͨΊʹ • ϨεϙϯεϗϫΠτϦετํࣜ
• ΤϯυϙΠϯτΛ͚Δͱ͖ͬ͢Γ͢ΔͷͰΦεεϝ
We’re Hiring!