$30 off During Our Annual Pro Sale. View Details »
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
31
14k
how-to-find-restful-api
MOROHASHI Kyosuke
August 19, 2015
Tweet
Share
More Decks by MOROHASHI Kyosuke
See All by MOROHASHI Kyosuke
dynamic!
moro
10
13k
Identifying User Idenity
moro
22
23k
Simplicity on Rails -- RDB, REST and Ruby
moro
18
20k
ちょうどよい Rails E2E テスト/enough-good-rails-e2e-test
moro
6
2.6k
フレームワークを作らない方法/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.1k
チームによるいきいきとしたソフトウェア開発/an-alive-team-grows-software
moro
3
3.5k
Web-E2E-Testing-from-Ruby
moro
5
600
Other Decks in Programming
See All in Programming
AtCoder Conference 2025「LLM時代のAHC」
imjk
2
490
Tinkerbellから学ぶ、Podで DHCPをリッスンする手法
tomokon
0
130
AIの誤りが許されない業務システムにおいて“信頼されるAI” を目指す / building-trusted-ai-systems
yuya4
6
3.6k
Socio-Technical Evolution: Growing an Architecture and Its Organization for Fast Flow
cer
PRO
0
340
著者と進める!『AIと個人開発したくなったらまずCursorで要件定義だ!』
yasunacoffee
0
140
AIコードレビューがチームの"文脈"を 読めるようになるまで
marutaku
0
360
開発に寄りそう自動テストの実現
goyoki
2
990
ハイパーメディア駆動アプリケーションとIslandアーキテクチャ: htmxによるWebアプリケーション開発と動的UIの局所的適用
nowaki28
0
420
ID管理機能開発の裏側 高速にSaaS連携を実現したチームのAI活用編
atzzcokek
0
230
リリース時」テストから「デイリー実行」へ!開発マネージャが取り組んだ、レガシー自動テストのモダン化戦略
goataka
0
130
バックエンドエンジニアによる Amebaブログ K8s 基盤への CronJobの導入・運用経験
sunabig
0
160
안드로이드 9년차 개발자, 프론트엔드 주니어로 커리어 리셋하기
maryang
1
110
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.6k
Thoughts on Productivity
jonyablonski
73
5k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Designing Experiences People Love
moore
143
24k
Building an army of robots
kneath
306
46k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.3k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Raft: Consensus for Rubyists
vanstee
141
7.2k
Producing Creativity
orderedlist
PRO
348
40k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
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) Λߦ͏͜ͱͰ ‣
Ϣʔβͷ༻ΛຬͨͤΔΑ͏ʹ͢ΔΞʔΩ ςΫνϟύλʔϯ
ͦΕͰ͚ͬ͜͏ ΞϓϦ͕ग़དྷΔͷͩ