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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
CVE-2026-20833_脆弱性対応とAES 化について
jukishiya
0
350
ご挨拶「10周年を迎える共創ラボのこれまでとこれから」
iotcomjpadmin
0
180
作る力から、見極める力へ — AI時代に広がるエンジニアの価値と役割
rince
0
400
アラート調査向けAIエージェントの本番導入とその後/AI Agents for Alert Investigation: Production Deployment and After
taddy_919
1
320
10x Speed With QA Agent Platform - How we scaled adoption from individual effort to organizational capability
lycorptech_jp
PRO
0
120
そこにあるから地図ができる~位置を示す"モノ"を愉しむ~ - Interface 2026年6月号GPS特集オフ会 / interface_202606_GPS_offline
sakaik
1
190
“ID沼入口” - 基本とセキュリティから始める、考え続けるためのID管理技術勉強会 告知&イントロ
ritou
0
380
Why is RC4 still being used?
tamaiyutaro
0
280
#エンジニアBooks 30分でわかる 「技術記事を書く技術」 / engineer-books 2026-06-30
jnchito
1
180
金融の未来を考える / Thinking About the Future of Finance
ks91
PRO
0
150
product engineering with qa
nealle
0
140
最近評価が難しくなった
maroon8021
0
200
Featured
See All Featured
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
460
Build your cross-platform service in a week with App Engine
jlugia
234
18k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
So, you think you're a good person
axbom
PRO
2
2.1k
Designing Powerful Visuals for Engaging Learning
tmiket
1
430
Raft: Consensus for Rubyists
vanstee
141
7.6k
Making the Leap to Tech Lead
cromwellryan
135
9.9k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
590
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
250
Building the Perfect Custom Keyboard
takai
2
810
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.3k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
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Ͱஸೡʹॻ͍࣮ͯͱ྆ํϝϯςφϯε͢Δͷ ͭΒ͍…