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
31
14k
how-to-find-restful-api
MOROHASHI Kyosuke
August 19, 2015
Tweet
Share
More Decks by MOROHASHI Kyosuke
See All by MOROHASHI Kyosuke
Identifying User Idenity
moro
9
15k
Simplicity on Rails -- RDB, REST and Ruby
moro
14
17k
ちょうどよい Rails E2E テスト/enough-good-rails-e2e-test
moro
5
2.4k
フレームワークを作らない方法/How NOT to build frameworks
moro
4
1.1k
全体がいい感じになるために、私たちRailsをホームにするWeb技術者ができること/let-our-whole-system-grow
moro
2
1.9k
フォームオブジェクトとの向き合い方/Grow Form Objects up
moro
1
2k
チームによるいきいきとしたソフトウェア開発/an-alive-team-grows-software
moro
3
3.3k
Web-E2E-Testing-from-Ruby
moro
5
530
Joyful user foundation restructuring with Ruby
moro
9
19k
Other Decks in Programming
See All in Programming
苦しいTiDBへの移行を乗り越えて快適な運用を目指す
leveragestech
0
590
お前もAI鬼にならないか?👹Bolt & Cursor & Supabase & Vercelで人間をやめるぞ、ジョジョー!👺
taishiyade
6
4k
Writing documentation can be fun with plugin system
okuramasafumi
0
120
『GO』アプリ バックエンドサーバのコスト削減
mot_techtalk
0
140
バックエンドのためのアプリ内課金入門 (サブスク編)
qnighy
8
1.8k
一休.com のログイン体験を支える技術 〜Web Components x Vue.js 活用事例と最適化について〜
atsumim
0
470
『GO』アプリ データ基盤のログ収集システムコスト削減
mot_techtalk
0
120
時計仕掛けのCompose
mkeeda
1
300
ソフトウェアエンジニアの成長
masuda220
PRO
10
1.1k
CI改善もDatadogとともに
taumu
0
120
パスキーのすべて ── 導入・UX設計・実装の紹介 / 20250213 パスキー開発者の集い
kuralab
3
780
PHPのバージョンアップ時にも役立ったAST
matsuo_atsushi
0
110
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
9
440
Designing for Performance
lara
604
68k
RailsConf 2023
tenderlove
29
1k
The Cost Of JavaScript in 2023
addyosmani
47
7.3k
Building an army of robots
kneath
303
45k
Building Applications with DynamoDB
mza
93
6.2k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
960
Rebuilding a faster, lazier Slack
samanthasiow
80
8.8k
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
Build The Right Thing And Hit Your Dates
maggiecrowley
34
2.5k
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) Λߦ͏͜ͱͰ ‣
Ϣʔβͷ༻ΛຬͨͤΔΑ͏ʹ͢ΔΞʔΩ ςΫνϟύλʔϯ
ͦΕͰ͚ͬ͜͏ ΞϓϦ͕ग़དྷΔͷͩ