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
how-to-find-restful-api
Search
MOROHASHI Kyosuke
August 19, 2015
Programming
14k
31
Share
how-to-find-restful-api
MOROHASHI Kyosuke
August 19, 2015
More Decks by MOROHASHI Kyosuke
See All by MOROHASHI Kyosuke
Railsの気持ちを考えながらコントローラとビューを整頓する/tidying-rails-controllers-and-views-as-rails-think
moro
5
480
dynamic!
moro
11
20k
Identifying User Idenity
moro
23
29k
Simplicity on Rails -- RDB, REST and Ruby
moro
18
21k
ちょうどよい Rails E2E テスト/enough-good-rails-e2e-test
moro
6
2.7k
フレームワークを作らない方法/How NOT to build frameworks
moro
4
1.3k
全体がいい感じになるために、私たちRailsをホームにするWeb技術者ができること/let-our-whole-system-grow
moro
2
2k
フォームオブジェクトとの向き合い方/Grow Form Objects up
moro
1
2.2k
チームによるいきいきとしたソフトウェア開発/an-alive-team-grows-software
moro
3
3.5k
Other Decks in Programming
See All in Programming
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
1
580
CSC307 Lecture 17
javiergs
PRO
0
310
Moments When Things Go Wrong
aurimas
3
140
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
2
370
AI駆動開発で崩れていくコードベースを立て直す
kyoko_nr_nr
1
410
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
190
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
2
1.1k
JavaDoc 再入門
nagise
0
240
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
170
密結合なバックエンドから TypeScript のコードを生成する
kemuridama
1
620
RTSPクライアントを自作してみた話
simotin13
0
420
Modding RubyKaigi for Myself
yui_knk
0
860
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
141
7.5k
Ruling the World: When Life Gets Gamed
codingconduct
0
240
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
The World Runs on Bad Software
bkeepers
PRO
72
12k
How to Ace a Technical Interview
jacobian
281
24k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
Accessibility Awareness
sabderemane
1
130
WENDY [Excerpt]
tessaabrams
11
38k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
590
Transcript
RESTful APIͷ Έ͚͔ͭͨ 2015-08-19 @moro
ॾڮګհ(@moro) Kyosuke MOROHASHI
None
άϥϯυϧʔϧ
3&45GVMͱ%# ͷςʔϒϧΛͦͷ· ·IUUQͰެ։͢Δ͜ ͱΛࢦ͢ͷͰͳ͍
‣ύεϫʔυݟͤͳ͍ɺͱ ͔ͦ͏͍͏Ͱͳ͍ ‣Ϟϊͷ߹ɺಉ͡Α͏ʹͳ Δ͜ͱଟ͍
‣ Web ΞϓϦέʔγϣϯ͕ఏڙ͢ΔػೳΛ ‣ Ϣʔβʹཱཻͭ(Ϧιʔε)Ͱ நԽ͠ ‣ ͦͷϦιʔεͷγϯϓϧͳૢ࡞(CRUD) Λߦ͏͜ͱͰ ‣
Ϣʔβͷ༻ΛຬͨͤΔΑ͏ʹ͢ΔΞʔΩ ςΫνϟύλʔϯ
‣Web ΞϓϦέʔγϣϯ͕ ఏڙ͢ΔػೳΛ ‣Ϣʔβʹཱཻͭ (Ϧιʔε)ͰநԽ
RESTful APIͷ Έ͚͔ͭͨ 2015-08-19 @moro
%#ͷ ϦιʔεΤϯςΟ ςΟى
‣ϞϊͷCRUD ‣ POST /articles ‣Ұ൪ Θ͔Γ͍͢ ‣Α͘αϯϓϧʹग़ͯ͘Δ
%#ͷ ΠϕϯτΤϯ ςΟςΟى
‣ؔੑͷCRUD ‣ POST /groups/42/memberships ‣2൪Ί?ʹΘ͔Γ͍͢ ݸਓతʹ͖
‣ʙ͢Δ/ͨ͜͠ͱ ‣DBςʔϒϧ͕͋ΔͷͰ Θ͔Γ͍͢ ‣has_many :through Ͱ ࢦఆ͢Δͭ
αϒϦιʔεͷ ૢ࡞
‣add_fooͨ͘͠ͳͬͨΒ ߟ͑Δ ‣POSTͷ͜ͱ͕ଟ͍ ‣ϦιʔεͷURIܾ·ΔͳΒ PUT ͋Γ
# よくやっちゃう。こうしたくなったら POST /articles/42/add_comment # サブリソースへ落とせる POST /articles/42/comments #
config/routes resources :articles do resources :comments end
‣verb+object ͳΞΫγϣϯ ͍͍ͩͨαϒϦιʔε ‣ͪΖΜࢀরͳΒGET
αϒίϨΫγϣ ϯͷૢ࡞
‣ಛఆͷςʔϚͰ·ͱΊͨϦ ιʔεͷू߹ ‣indexͰ݅ذΛؤுΓ ա͗ͨΒ
# あと4つくらいパラメータが増える GET /articles?filter=favorited&limit=3 # これは典型的なまとまりに名前をつけるとよい GET /articles/hot
‣ΞΫγϣϯ͕͔ΕΔͷͰ ͖ͬ͢Γ͢Δ
͏Μͪ͘: routing ηϨΫλϒϧσΟ εύονͳΘ͚ͰɺΑ͏͢ΔʹͦΕ ࣗମذͷҰछɻ ͦΕΛҰͭॲʹ·ͱΊ্ͨͰ͏Ұ ճࣗͰذΛॻ͖͢ɺΈ͍ͨͳ ͜ͱΛ͢Δͷෆໟɻ
ϝϯόϦιʔε ͷૢ࡞
‣ ಛఆͷ(ൺֱతେࣄͳ)ଐੑͷૢ࡞ɻ ‣ set_foo Έ͍ͨͳϧʔςΟϯάΛॻ ͖ͨ͘ͳͬͨΒίϨɻ ‣ POST PUT
ͷ͜ͱ͕ଟ͍ɻ
# 記事を下書きから公開にする例 # set_foo ではなく POST /articles/42/set_public # public ->
publication と名詞にした上で # それを「作成」する PUT /articles/42/publication # 非公開にするには「公開していること」を消す POST /articles/42/set_private DELETE /articles/42/publication
τϥϯβΫγϣϯ Ϧιʔε
‣ ʮେ͖Ίͷॲཧ͢Δ͜ͱʯΛ ද͢Ϧιʔε ‣ ಛʹɺෳͷσʔλΛ·ͱΊ ͯѻ͏Α͏ͳ߹ʹ͏
‣ ࡞Δ͚ͩͰͳ͘ɺ࣮ߦ݁Ռ ֬ೝ·ͰؚΉɺॲཧશମΛϦ ιʔεͱͯ͠நԽ͢Δ ‣ ࣮తʹɺॲཧͷ࣮ମඇ ಉظJob ʹྲྀ͢͜ͱ͋Δ
=begin 実際の例: とある条件で、たくさんのデータをエクスポート する必要あり。 まずはエクスポート条件を指定する画面 (ユーザナビゲーション用のリソースが必要) =end # ここでは条件指定フォームを表示 GET
/foo_exports/new # 指定した条件でエクスポート処理リソース作成。 # 処理の本体はActiveJobとかに POST /foo_exports
# ジョブを作ったら詳細にリダイレクト # ジョブの進捗を出せる範囲で出しておく GET /foo_exports/42 # しばらく待ってリロードすると(※)終わる。 # 結果やログへのナビゲーションをつけておく
GET /foo_exports/42/data.csv GET /foo_exports/42/log.txt // ※ もちろんもっといまふうなWebSocketとかでもOK
αϒϦιʔεͷ ΠϯϥΠϯԽ
‣ ؔ࿈͍ͯ͠ΔϦιʔεJSON ͳͲͰωετ͢Δɻ ‣ ωετ͠ͳ͍߹ͷࢀর URLͰɻ ‣ id ͚ͩͰΈཱͯආ͚Δɻ
{article: { id: 42, tiltle: 'RESTful API ͷΈ͚͔ͭͨ', url: ‘http://speaekrdeck.com/moro/...',
comments: [ {id: 1, body: '͍͢͝'}, {id: 2, body: 'ײಈͨ͠'}, ] }}
"3FTਓྨʹ ૣ͗͢Δ
ɺࠓ͠·ͤΜ
σβΠϯͷ ώϯτ
‣ Railsͷ`resources`͕࡞Δͯ͢ͷΞΫ γϣϯΛ࣋ͭඞཁͳ͍ɻ ‣ ͋ͷαϒηοτͱͯ͠ɺϦιʔεΛૢ࡞ ͭͭ͠ɺϦϯΫϑΥʔϜΛͬͯΞ ϓϦέʔγϣϯΛ࡞Δ͜ͱ͕େࣄɻ
Α͋͘Δ φϏήʔγϣϯྫ
‣ Ұཡը໘ͷԼ෦ʹՃϑΥʔϜ͕͋Δ (`new` ͕ͳ͍) ‣ ফͤͳ͍ͷͰ delete ͕ͳ͍ ‣ मਖ਼Ͱ͖ͳ͍ͷͰ
edit / update ͕ͳ͍ɻ
‣ ৄࡉը໘ͷதͰɺ͡Ί͔ΒςΩετ ϑΟʔϧυʹ͕ॻ͍ͯ͋Δ ‣ or JSͰϑΥʔϜΛ࡞ͬͨΓ͢ΔͷͰ͢ ͙ʹߋ৽Ͱ͖Δ(edit ͕ͳ͍) ‣ Ϧιʔεͷৄࡉը໘ʹࢠϦιʔε͕ද
ࣔ͞ΕΔɻ(index show ͳ͍)
ಠࣗݚڀ
ෳ߹Ϧιʔε ଟछϙʔλϧ
‣Q: RESTfulAPIͰʮϙʔλ ϧϖʔδʯΛͲ͏࡞Δ͔ ‣ ͍ΖΜͳͷΛऔΓʹߦ͘ͱϦΫ Τετ૿͑͗ͯͭ͢Β͍
‣ ৽ணΤϯτϦ10݅ ‣ ਓؾΤϯτϦ10݅ ‣ ͓Βͤ 3݅ ‣ χϡʔε 5݅
…
‣A: ϙʔλϧͱ͍͏ ϦιʔεΛఆٛ͢Εྑ͍ ͷͰ?
͓͞Β͍
3&45GVMͱ%# ͷςʔϒϧΛͦͷ· ·IUUQͰެ։͢Δ͜ ͱΛࢦ͢ͷͰͳ͍
‣ Web ΞϓϦέʔγϣϯ͕ఏڙ͢ΔػೳΛ ‣ Ϣʔβʹཱཻͭ(Ϧιʔε)Ͱ நԽ͠ ‣ ͦͷϦιʔεͷγϯϓϧͳૢ࡞(CRUD) Λߦ͏͜ͱͰ ‣
Ϣʔβͷ༻ΛຬͨͤΔΑ͏ʹ͢ΔΞʔΩ ςΫνϟύλʔϯ
ͦΕͰ͚ͬ͜͏ ΞϓϦ͕ग़དྷΔͷͩ