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
あなたの知らないPDFのアクセシビリティ
lycorptech_jp
PRO
0
220
2026年6月23日 Syncable Tech + Start Python Club にて
hamukazu
0
140
Claude Codeをどのように キャッチアップしているか
oikon48
13
8.6k
徹底討論!ECS vs EKS!
daitak
3
1.1k
SONiCの統計情報を取得したい
sonic
0
240
ザ・データベース、MySQL ~ OSC 2026 Sendai ~
sakaik
0
150
アンオフィシャルな、オフィシャルからのお願い
wyamazak_devrel
0
140
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
2k
[チョークトーク資料]AWS DevOps Agent を使いこなす / AWS Dev Ops Agent Chalk Talk AWS Summit Japan 2026
kinunori
3
630
Kiro Ambassador を目指す話
k_adachi_01
0
110
現地で盛り上がった WWDC26 Keynote
zozotech
PRO
1
270
現場のトークンマネジメント
dak2
1
150
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
247
13k
A Tale of Four Properties
chriscoyier
163
24k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
400
Statistics for Hackers
jakevdp
799
230k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
320
Facilitating Awesome Meetings
lara
57
7k
Building the Perfect Custom Keyboard
takai
2
800
Exploring anti-patterns in Rails
aemeredith
3
420
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
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Ͱஸೡʹॻ͍࣮ͯͱ྆ํϝϯςφϯε͢Δͷ ͭΒ͍…