Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Rails and JSON API in 2019
Search
Akinori MUSHA
May 07, 2019
Technology
260
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
400
日本語入力を再考する
knu
1
560
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
740
Other Decks in Technology
See All in Technology
メルペイ 会計システム概要と歴史
mewuto
0
200
20260930_Gemma4_Hands-on
tsho
0
240
AI時代に必要な脅威モデリング― 変化の速度に負けない理解とリスク判断
masakane55
5
1.2k
ログラスのマルチプロダクトを 支える認証基盤 〜テナントごとに異なる統制とどう向き合うか〜
dada4386
3
410
検証フェーズはAIの回答を判断するための学習機会
toru_kubota
2
530
ai_cording_with_k8s_knowledge.pdf
mochizuki875
1
310
Snapshot Testing in Practice: Predictable and Reliable SwiftUI Views
fespinoza
0
160
Datadog の学び方 - あるいは、オブザーバビリティを学ぶとは何か
mananyuki
1
500
オンラインゲームのシステム全体像 - コロプラ 2026年度 新卒研修
colopl
0
930
おそらく日本で唯一のDevRelインターン生として
husengs7
0
170
自主式軟體工廠
philipz
0
240
生成AIで高い生産性を求められて、 悩み、乗り越えた話
mot_techtalk
2
130
Featured
See All Featured
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
260
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
540
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
260
A Tale of Four Properties
chriscoyier
163
24k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
390
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.2k
How STYLIGHT went responsive
nonsquared
100
6.3k
Bash Introduction
62gerente
615
220k
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Ͱஸೡʹॻ͍࣮ͯͱ྆ํϝϯςφϯε͢Δͷ ͭΒ͍…