Upgrade to Pro — share decks privately, control downloads, hide ads and more …

how-to-find-restful-api

 how-to-find-restful-api

70e13d9877054026fda46d5a5b53a236?s=128

MOROHASHI Kyosuke

August 19, 2015
Tweet

Transcript

  1. RESTful APIͷ Έ͚͔ͭͨ 2015-08-19 @moro

  2. ॾڮګհ(@moro) Kyosuke MOROHASHI

  3. None
  4. άϥϯυϧʔϧ

  5. 3&45GVMͱ͸%# ͷςʔϒϧΛͦͷ· ·IUUQͰެ։͢Δ͜ ͱΛࢦ͢ͷͰ͸ͳ͍

  6. ‣ύεϫʔυ͸ݟͤͳ͍ɺͱ ͔ͦ͏͍͏࿩Ͱ΋ͳ͍ ‣Ϟϊͷ৔߹ɺಉ͡Α͏ʹͳ Δ͜ͱ΋ଟ͍

  7. ‣ Web ΞϓϦέʔγϣϯ͕ఏڙ͢ΔػೳΛ ‣ Ϣʔβʹ໾ཱཻͭ౓(Ϧιʔε)Ͱ
 ந৅Խ͠ ‣ ͦͷϦιʔε΁ͷγϯϓϧͳૢ࡞(CRUD) Λߦ͏͜ͱͰ ‣

    Ϣʔβͷ༻ΛຬͨͤΔΑ͏ʹ͢ΔΞʔΩ ςΫνϟύλʔϯ
  8. ‣Web ΞϓϦέʔγϣϯ͕
 ఏڙ͢ΔػೳΛ ‣Ϣʔβʹ໾ཱཻͭ౓
 (Ϧιʔε)Ͱந৅Խ

  9. RESTful APIͷ Έ͚͔ͭͨ 2015-08-19 @moro

  10. %#ͷ 
 ϦιʔεΤϯςΟ ςΟى఺

  11. ‣ϞϊͷCRUD ‣ POST /articles ‣Ұ൪ Θ͔Γ΍͍͢ ‣Α͘αϯϓϧʹग़ͯ͘Δ

  12. %#ͷ 
 ΠϕϯτΤϯ ςΟςΟى఺

  13. ‣ؔ܎ੑͷCRUD ‣ POST /groups/42/memberships ‣2൪Ί?ʹΘ͔Γ΍͍͢
 ݸਓతʹ޷͖

  14. ‣ʙ͢Δ/ͨ͜͠ͱ ‣DBςʔϒϧ͕͋ΔͷͰ
 Θ͔Γ΍͍͢ ‣has_many :through Ͱ
 ࢦఆ͢Δ΍ͭ

  15. αϒϦιʔεͷ ૢ࡞

  16. ‣add_fooͨ͘͠ͳͬͨΒ
 ߟ͑Δ ‣POSTͷ͜ͱ͕ଟ͍ ‣ϦιʔεͷURIܾ·ΔͳΒ PUT ΋͋Γ

  17. # よくやっちゃう。こうしたくなったら POST /articles/42/add_comment 
 # サブリソースへ落とせる POST /articles/42/comments #

    config/routes
 resources :articles do resources :comments end
  18. ‣verb+object ͳΞΫγϣϯ ͸͍͍ͩͨαϒϦιʔε΁ ‣΋ͪΖΜࢀরͳΒGET

  19. αϒίϨΫγϣ ϯͷૢ࡞

  20. ‣ಛఆͷςʔϚͰ·ͱΊͨϦ ιʔεͷू߹ ‣indexͰ৚݅෼ذΛؤுΓ ա͗ͨΒ

  21. # あと4つくらいパラメータが増える GET /articles?filter=favorited&limit=3 # これは典型的なまとまりに名前をつけるとよい GET /articles/hot

  22. ‣ΞΫγϣϯ͕෼͔ΕΔͷͰ ͖ͬ͢Γ͢Δ

  23. ͏Μͪ͘: routing ͸ηϨΫλϒϧσΟ εύονͳΘ͚ͰɺΑ͏͢ΔʹͦΕ ࣗମ෼ذͷҰछɻ ͦΕΛҰͭॲʹ·ͱΊ্ͨͰ΋͏Ұ ճࣗ෼Ͱ෼ذΛॻ͖௚͢ɺΈ͍ͨͳ ͜ͱΛ͢Δͷ͸ෆໟɻ

  24. ϝϯόϦιʔε ͷૢ࡞

  25. ‣ ಛఆͷ(ൺֱతେࣄͳ)ଐੑͷૢ࡞ɻ ‣ set_foo Έ͍ͨͳϧʔςΟϯάΛॻ ͖ͨ͘ͳͬͨΒίϨɻ ‣ POST ΍ PUT

    ͷ͜ͱ͕ଟ͍ɻ
  26. # 記事を下書きから公開にする例 # set_foo ではなく POST /articles/42/set_public # public ->

    publication と名詞にした上で # それを「作成」する PUT /articles/42/publication # 非公開にするには「公開していること」を消す POST /articles/42/set_private DELETE /articles/42/publication
  27. τϥϯβΫγϣϯ
 Ϧιʔε

  28. ‣ ʮେ͖Ίͷॲཧ͢Δ͜ͱʯΛ ද͢Ϧιʔε ‣ ಛʹɺෳ਺ͷσʔλΛ·ͱΊ ͯѻ͏Α͏ͳ৔߹ʹ࢖͏

  29. ‣ ࡞Δ͚ͩͰͳ͘ɺ࣮ߦ΍݁Ռ ֬ೝ·ͰؚΉɺॲཧશମΛϦ ιʔεͱͯ͠ந৅Խ͢Δ ‣ ࣮૷తʹ͸ɺॲཧͷ࣮ମ͸ඇ ಉظJob ʹྲྀ͢͜ͱ΋͋Δ

  30. =begin 実際の例: とある条件で、たくさんのデータをエクスポート する必要あり。 まずはエクスポート条件を指定する画面 (ユーザナビゲーション用のリソースが必要) =end # ここでは条件指定フォームを表示 GET

    /foo_exports/new # 指定した条件でエクスポート処理リソース作成。 # 処理の本体はActiveJobとかに POST /foo_exports
  31. # ジョブを作ったら詳細にリダイレクト # ジョブの進捗を出せる範囲で出しておく GET /foo_exports/42 # しばらく待ってリロードすると(※)終わる。 # 結果やログへのナビゲーションをつけておく

    GET /foo_exports/42/data.csv GET /foo_exports/42/log.txt // ※ もちろんもっといまふうなWebSocketとかでもOK
  32. αϒϦιʔεͷ ΠϯϥΠϯԽ

  33. ‣ ؔ࿈͍ͯ͠ΔϦιʔε͸JSON ͳͲͰωετ͢Δɻ ‣ ωετ͠ͳ͍৔߹ͷࢀর͸ URLͰɻ ‣ id ͚ͩͰ૊Έཱͯ͸ආ͚Δɻ

  34. {article: { id: 42, tiltle: 'RESTful API ͷΈ͚͔ͭͨ', url: ‘http://speaekrdeck.com/moro/...',

    comments: [ {id: 1, body: '͍͢͝'}, {id: 2, body: 'ײಈͨ͠'}, ] }}
  35. "3FT͸ਓྨʹ ૣ͗͢Δ࿩

  36. ͸ɺࠓ೔͸͠·ͤΜ

  37. σβΠϯͷ ώϯτ

  38. ‣ Railsͷ`resources`͕࡞Δ͢΂ͯͷΞΫ γϣϯΛ࣋ͭඞཁ͸ͳ͍ɻ ‣ ͋ͷαϒηοτͱͯ͠ɺϦιʔεΛૢ࡞ ͭͭ͠ɺϦϯΫ΍ϑΥʔϜΛ࢖ͬͯΞ ϓϦέʔγϣϯΛ࡞Δ͜ͱ͕େࣄɻ

  39. Α͋͘Δ
 φϏήʔγϣϯྫ

  40. ‣ Ұཡը໘ͷԼ෦ʹ௥ՃϑΥʔϜ͕͋Δ
 (`new` ͕ͳ͍) ‣ ফͤͳ͍ͷͰ delete ͕ͳ͍ ‣ मਖ਼Ͱ͖ͳ͍ͷͰ

    edit / update ͕ͳ͍ɻ
  41. ‣ ৄࡉը໘ͷதͰɺ͸͡Ί͔ΒςΩετ ϑΟʔϧυʹ஋͕ॻ͍ͯ͋Δ ‣ or JSͰϑΥʔϜΛ࡞ͬͨΓ͢ΔͷͰ͢ ͙ʹߋ৽Ͱ͖Δ(edit ͕ͳ͍) ‣ ਌Ϧιʔεͷৄࡉը໘ʹࢠϦιʔε͕ද

    ࣔ͞ΕΔɻ(index ΋ show ΋ͳ͍)
  42. ಠࣗݚڀ

  43. ෳ߹Ϧιʔε ଟछϙʔλϧ

  44. ‣Q: RESTfulAPIͰʮϙʔλ ϧϖʔδʯΛͲ͏࡞Δ͔ ‣ ͍ΖΜͳ΋ͷΛ౎౓औΓʹߦ͘ͱϦΫ Τετ਺૿͑͗ͯͭ͢Β͍

  45. ‣ ৽ணΤϯτϦ10݅ ‣ ਓؾΤϯτϦ10݅ ‣ ͓஌Βͤ 3݅ ‣ χϡʔε 5݅

  46. ‣A: ϙʔλϧͱ͍͏
 ϦιʔεΛఆٛ͢Ε͹ྑ͍ ͷͰ͸?

  47. ͓͞Β͍

  48. 3&45GVMͱ͸%# ͷςʔϒϧΛͦͷ· ·IUUQͰެ։͢Δ͜ ͱΛࢦ͢ͷͰ͸ͳ͍

  49. ‣ Web ΞϓϦέʔγϣϯ͕ఏڙ͢ΔػೳΛ ‣ Ϣʔβʹ໾ཱཻͭ౓(Ϧιʔε)Ͱ
 ந৅Խ͠ ‣ ͦͷϦιʔε΁ͷγϯϓϧͳૢ࡞(CRUD) Λߦ͏͜ͱͰ ‣

    Ϣʔβͷ༻ΛຬͨͤΔΑ͏ʹ͢ΔΞʔΩ ςΫνϟύλʔϯ
  50. ͦΕͰ͚ͬ͜͏ ΞϓϦ͕ग़དྷΔͷͩ