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
Rails and JSON API in 2019
Search
Akinori MUSHA
May 07, 2019
Technology
250
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rails and JSON API in 2019
Akinori MUSHA
May 07, 2019
More Decks by Akinori MUSHA
See All by Akinori MUSHA
上手なPRと機能要望の勘所
knu
1
360
日本語入力を再考する
knu
1
540
RubyとRailsの何が強いのか
knu
7
16k
OSSで結果を出す方法
knu
16
11k
Evolution Of Enumerator
knu
3
5.2k
What's Cooking In Ruby 2.7
knu
1
730
Other Decks in Technology
See All in Technology
LayerXにおけるセキュリティ管理の現在地と次の一手
tosho
0
250
SONiCで構築・運用する生成AI向けパブリッククラウドネットワーク ~実装編~
sonic
0
290
脆弱性対応、どこで線を引くか
rymiyamoto
1
420
Agile and AI Redmine Japan 2026
hiranabe
3
350
2026TECHFRESH畢業分享會 - 葬送的通靈師:化系統與用戶雜訊成行動訊號
line_developers_tw
PRO
0
1.3k
Chainlitで作るお手軽チャットUI
ynt0485
0
280
フィジカル版Github Onshapeの紹介
shiba_8ro
0
290
秘密度ラベル初心者が第1歩でつまづかないための「設計・運用」ポイント
seafay
PRO
0
350
【NRUG vol.18】KubernetesにおけるNew Relicデータ取得量削減の考え方
nrug_member
0
170
Kubernetesにおける学習基盤とLLMOpsの概要
ry
1
330
[AWS Summit Japan 2026]迷っているあなたへ_小さな一歩が、やがて自分を助けてくれる
sh_fk2
1
210
アンオフィシャルな、オフィシャルからのお願い
wyamazak_devrel
0
140
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
50
15k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
220
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
WCS-LA-2024
lcolladotor
0
650
Building Adaptive Systems
keathley
44
3.1k
How to Think Like a Performance Engineer
csswizardry
28
2.7k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
620
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
480
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Transcript
Rails and JSON API In 2019 Akinori Musha (@knu)
JSON API In 2019 • JSON:API • OpenAPI
JSON:API
JSON:API • RESTfulͳAPIʹ͓͍ͯɺREST͕نఆ͍ͯ͠ͳ͍͕΅ΜΓఆࣜԽ͖ͯͨ͠ϓϥΫςΟεΛ ن֨ͱͯ͠औΓ·ͱΊ͍ͯΔͷ https://jsonapi.org/ • JSONΛϕʔεͱͨ͠ཁٻɾԠϑΥʔϚοτΛࡦఆ • HALͳͲͷൃలܥɺܾఆ൛ •
ཤྺ • 201812݄ 1.1RC • 2015 5݄ 1.0࠷ऴ൛ • 2013 5݄ ࠷ॳͷυϥϑτ
RESTͱ • 2000ɺApache HTTP ServerϓϩδΣΫτͷcofounderͰHTTP/1.1ͷࡦఆʹ ؔΘͬͨRoy Fielding͕ത࢜߸จͰఏএ • REpresentational State
Transferͷ಄ࣈޠ • REpresentational State = දݱՄೳͳঢ়ଶ = ͍ΘΏΔϦιʔε • Transfer = సૹ • HTTPʹ্ΛՍͨ͠ϝλRPCϓϩτίϧʢSOAPXMLRPCʣɺHTTPΛ୯ ͳΔτϥϯεϙʔτɾτϯωϧͱ͖ͯͬͯͨ͠༻๏ʹର͢ΔΞϯνςʔθ • HTTPݪཧओٛ
JSONͱ • 2001ɺDouglas Crockford͕WebϕʔεͷΞϓϦέʔγϣϯΛ։ൃ͢Δࡍʹʮൃݟʯͨ͠σʔλަϑΥʔϚοτ • The JSON Saga ▶ •
୯ͳΔJavaScriptͷΦϒδΣΫτϦςϥϧͰHTMLυΩϡϝϯτʹຒΊࠐΉࡍʹ·͍ͣͱؾ͍ͮͨ • ΩʔΛඞͣΫΦʔτ͢Δ • ES3Ͱ༧ޠΛΩʔʹͰ͖ͳ͔ͬͨ(ES5ͰՄೳʹͳͬͨ) • Pythonͷdictionaryͷه๏ͱҰக͍ͯͨ͠ • eval("{a:42}")ͯ͠ΈΔͱ͔Δ͕ɺϒϩοΫʹϥϕϧa:ͱࣜ42͕͋Δͱղऍ͞Εͯ͠·͏ɺͱ͍͏ཧ༝͋Δ • จࣈྻϦςϥϧʹͳ \ Λڐ͢ • </script> Λ <\/script> ͱ͢ΔͳͲͯ͠ແޮԽͰ͖ΔΑ͏ʹ • evalͰ͖Δͱ͍͏ख͔ܰ͞Β࢝·͕ͬͨɺ҆શΛ֬ೝੑ͢Δͷ͕େม • ઐ༻ύʔαʔ͕ඞཁ(JSON.parse)
RESTͱ • 4ͭͷݪଇ • Addressability ͯ͢ͷૢ࡞ରURIʢϢχόʔαϧʹϢχʔΫͳ໊લʣͰࣔ͞ΕΔ • Statelessness ηογϣϯͷঢ়ଶཧͤͣɺݸʑͷૢ࡞͕ಠཱ͍ͯ͠Δ •
Connectedness ใͷؔ࿈URIͷϦϯΫͰࣔ͢ • Uniform Interface HTTPϝιουΛڞ௨ޠኮͱ͠ɺ͋ΒΏΔૢ࡞ΛGET, POST, PUT, DELETEͰද͢
OpenAPI
OpenAPI Specification • 2017ʹग़ͨɺRESTful APIͷ༷Λهड़͢ΔͨΊͷݴޠ ʢJSON|YAMLʣ • https://www.openapis.org/ • Swagger
Specification (ʙ2.0)ͷޙܧ • SwaggerRESTful APIΛߏங͢ΔͨΊͷϑϨʔϜϫʔΫɾ πʔϧʢ2011ʙʣ
OpenAPI Specification (3.0) • ཤྺ • 2018-10-08 OpenAPI Specification 3.0.2
• 2017-12-06 OpenAPI Specification 3.0.1 • 2017-07-26 OpenAPI Specification 3.0.0 • 2016-01-01 OpenAPI Initiativeൃ • 2014-09-08 Swagger Specification 2.0 • 2014-03-14 Swagger Specification 1.2 • 2012-08-22 Swagger Specification 1.1 • 2011-08-10 Swagger Specification 1.0
OpenAPI Specification (3.0) • ΤϯυϙΠϯτͱཁٻɾԠͷσʔλεΩʔϚͳͲΛแׅతʹهड़Ͱ͖Δ • JSON:APIɺHALͱߦͨ֓͠೦ • JSON SchemaΛऔΓࠐΜͰεΩʔϚఆٛݴޠͱͯ͠ར༻͍ͯ͠Δ
• શʹಉظɾਵ͍ͯ͠ΔΘ͚Ͱͳ͍(JSON Schema͖ʹΓυϥϑτΛॏͶ ͍ͯͯɺखΓଟ͍) • JSON Hyper Schemaͱগ͔͠Ϳ͍ͬͯΔ • OpenAPI͕ࣗಠࣗʹΤϯυϙΠϯτใͷهड़ݴޠΛ͍࣋ͬͯΔ • OpenAPIΫΤϦʔύϥϝʔλύεύϥϝʔλʹ͍ͭͯbodyಉ༷ʹ౷Ұతͳ จ๏Ͱهड़Ͱ͖ΔΑ͏ʹਐԽ
JSON Schema
JSON Schema • JSONσʔλͷεΩʔϚͷهड़ݴޠ https://json-schema.org/ • ͦΕࣗମ͕JSONͰهड़͞ΕΔ • ҎԼͷ༷ͷ૯শ •
JSON Schema Core • JSON Schema Validation • JSON Hyper-Schema • Relative JSON Pointers • ཤྺ • 2018-03-19 draft-07
JSON Schema • JSON Schema Core • JSON Schemaͷج൫༷ εΩʔϚόʔδϣϯͷએݴɺωετɺ෦ɾ֎෦ࢀরͳͲʹ͍ͭͯنఆ͞Ε͍ͯΔ
$schema, $ref, $idͳͲ ͦͷଞͷ۩ମతͳޠኮ͜͜Ͱنఆ͞Ε͍ͯͳ͍ • JSON Schema Validation • JSON Schemaͷ༷ͷຊମ σʔλܕɺόϦσʔγϣϯϧʔϧΛهड़͢ΔͨΊͷޠኮ͕ఆٛ͞Ε͍ͯΔ ɺ࣌ࠁɺϝʔϧΞυϨεɺURIͳͲσʔλܕͱͯ͠ఆٛ͞Ε͍ͯΔ(JSONදݱࣗମString)
JSON Schema • JSON Hyper-Schema • ϋΠύʔϝσΟΞ(ϦϯΫ)Λهड़͢ΔͨΊͷޠኮ͕ఆٛ͞Ε ͍ͯΔ • Relative
JSON Pointers • JSONυΩϡϝϯτͷಛఆͷΩʔΛࢀর͢ΔͨΊͷه๏ $refͰ # Ҏ߱ʹهड़͢ΔΞϯΧʔͰΘΕΔ
RailsͰJSON:API
RailsͰJSON:API • OpenAPI 3.0Ͱهड़ͯ͠Έ͍ͨ • JSON:APIͰͬͯΈ͍ͨ
OpenAPI 3.0Ͱهड़ͯ͠Έ͍ͨ • committee gemΛͬͯΈͨ γϯϓϧʹཁٻɾԠόϦσʔγϣϯ͚ͩΛՃ͢ΔRackϛ υϧΣΞू OpenAPI 3.0ରԠ͕ૣ͘ɺͦͪΒʹد͍ͤͯ͘ಈ͖·͍͠ •
swagger-blocksͷΑ͏ͳRubyͷDSLཕ… OpenAPI 3.0ରԠ͕ݟ͑ͳ͍
JSON:APIͰͬͯΈ͍ͨ • JSONγϦΞϥΠβʔͷબ͕େࣄ • jbuilder • ActiveModel::Serializers • fast_jsonapi •
rabl
JSONγϦΞϥΠβʔͷൺֱ • jbuilder • DSL͕͍·͍ͪ • ͘ͳ͍ • ActiveModel::Serializers •
ྑ͘ѱ͘σϑΝΫτελϯμʔυ • ϓϩδΣΫτ͕ಈ͍͍ͯͳ͍ • 0.10.xͰ೩͑ਚ͖ͨʁ
JSONγϦΞϥΠβʔͷൺֱ • fast_jsonapi • Netflixɺͯ͘Αͦ͞͏ • JSON:APIʹدͤͨσϑΥϧτ • AMSʹ͍͍ۙ৺ •
ొ৽͍͕͠ɺ͞΄Ͳ։ൃ͕׆ൃͱ͍͏Θ͚Ͱͳ͍ • rabl • Ϟσϧʹର͢ΔserializerɺͰͳ͘ϏϡʔςϯϓϨʔτɺίϯϙʔωϯτܕ • චऀ͕͍׳Ε͍ͯΔ
Rabl • RubyʹΑΔDSLͱ͍͏ͷଞͱಉ͡ • RailsͷϏϡʔͱͯ͠ಈ͘ • JSONΛੜ͢ΔςϯϓϨʔτ (*.json.rabl) • ଞͷγϦΞϥΠβʔجຊతʹϞσϧͱJSONදݱ͕1:1͕ͩɺRablίϯςΩ
ετʹԠͯࣗ͡༝ʹςϯϓϨʔτΛબͼɺదٓpartialͰऔΓࠐΊΔ • OpenAPIͷcomponentsͰϞσϧΛఆٛͯ͠$refͰࢀরɺͱ͍͏Ϟσϧͱ ૬ੑྑ͍ͣ • rabl-railsΛ͏ͱ݁ߏ͍
rabl-rails • rablຊՈRailsʹରԠ͍ͯ͠Δ͕ɺςϯϓϨʔτΤϯδϯͱ ͯ͠rablΛ͍ͭͭɺίϯύΠϧͱల։ͷεςʔδΛ͚ͯ ੑೳΛେ෯ʹ্͛Δrabl-railsͱ͍͏gem͕͋Δ • ͜ΕͦͷΈ্ɺΠϯελϯεมΛͦͷ··͑ͳ͍ ͳͲॻ͖ํ͕গ͠มΘΔ • rablຊՈͷWikiͳͲͷྫΛಡΈସ͑ɾॻ͖͑Δඞཁ͕ग़
ͯ͘Δ
rablͱlayout • rablRailsͷϏϡʔͱͯ͠ಈ͘ɺͱ͍͏͜ͱJSON:APIʹԊͬͨΨϫΛ layoutͱͯ͠࡞Εɺฦ͍ͨ͠dataΛهड़͢Δ͚ͩͰࣗಈతʹԠ͕࡞Εͯ ศར…ʂ • ͱࢥ͍͖ɺrablͷDSL࣮ͱRubyͷߏจ্ͷ੍͔ΒςϯϓϨʔτʹ yieldΛஔ͘ͱจ๏Τϥʔʹͳͬͯ͠·͏ • ͭ·ΓrablͰlayoutΛॻ͘͜ͱͰ͖ͳ͍…
• erbhamlΛ͑Ͱ͖Δ͕ॻ͖৺ྑ͘ͳ͍ • layout͍͍ͤͥยखͰΓΔఔͳͷͰΛͭͿΖ͏…
࣮ྫ
࣮ྫ • committeeͱrablͰ࡞ͬͯΈ·ͨ͠ • https://github.com/knu/jsonapi-example • ԠόϦσʔγϣϯ • ։ൃڥͷΈͰ༗ޮԽ •
ςετڥͰrequest specͰ໌ࣔతʹassertionΛೖΕΔ ༗ޮԽͯ͠͠·͏ͱHTTPεςʔλεͷ࣌Ͱ͚ͯ͜͠·͍ͬͯͮΒ͍ • ϓϩμΫγϣϯڥͰςετΛ௨͍ͬͯΔͣͳͷͰɺ࿙Εͷ෦ͰϋʔυΤϥʔʹͳͬͯࠔΔ ݕ͚ͩͰ͖Δػೳ ͕४උதͳͷͰɺ࣮͞ΕͨΒ͏ͱΑͦ͞͏ • JSONϏϡʔΨϫlayoutɺΤϯυϙΠϯτͷςϯϓϨʔτɺcomponentʹରԠͨ͠partialɺͱOpenAPIఆٛ ʹԊͬͯ࡞ • ࡉ͔͍ͱ͜ΖͰɺJSON:APIͷMIME type (application/vnd.api+json)Λ͏Α͏ʹͨ͠
ײ OpenAPIɺSwagger 2.0͔ΒҠߦͰ͖ͳ͍πʔϧ͕ଟͦ͏ͩ ͕ɺҰ͔Β͏ʹ͍উखྑ͍ JSON:APIʹ͍ͭͯɺ४ڌ͕Ͳͷ͘Β͍͏Ε͍͔͠Θ͔Βͳ͍ Ұํɺ࣮JSON:APIରԠΛ͏ͨ͏γϦΞϥΠβ͔ɺrablͷΑ͏ ʹॊೈੑͷߴ͍ͷΛΘͳ͍ͱ໘ JSON SchemaͰஸೡʹॻ͍࣮ͯͱ྆ํϝϯςφϯε͢Δͷ ͭΒ͍…