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
Overview: Swift OpenAPI Generator
Search
ojun
January 25, 2024
Technology
2.6k
3
Share
Overview: Swift OpenAPI Generator
ojun
January 25, 2024
More Decks by ojun
See All by ojun
配列と所有権
ojun9
0
51
生成 AI 時代のスナップショットテストってやつを見せてあげますよ(α版)
ojun9
0
350
アセットのコンパイルについて
ojun9
0
220
Exit 8 for SwiftUI
ojun9
1
280
Swift Evolution かるた
ojun9
2
140
Xcode 16のPreviewModifierと@Previewableを活用した効率的なプレビュー方法の考察
ojun9
4
1k
Catch Up with Swift 5.10
ojun9
2
900
if 式と switch 式による SwiftUI のプレビューエラー対策
ojun9
1
2.2k
楽しい夏休み!String Catalogs で新しい発見
ojun9
0
2.5k
Other Decks in Technology
See All in Technology
20260428_Product Management Summit_Loglass_JoeHirose
loglassjoe
3
4k
「SaaSの次の時代」に重要性を増すステークホルダーマネジメントの要諦 ~解像度を圧倒的に高めPdMの価値を最大化させる方法~
kakehashi
PRO
3
2.6k
生成AI時代のドキュメントに対する期待の整理と実践から得た学び / Rethinking Documentation for LLM: Lessons from Practice
bitkey
PRO
1
100
弁護士ドットコム株式会社 エンジニア職向け 会社紹介資料
bengo4com
1
190
ハーネスエンジニアリングをやりすぎた話 ~そのハーネスは解体された~
gotalab555
5
1.9k
国内外の生成AIセキュリティの最新動向 & AIガードレール製品「chakoshi」のご紹介 / Latest Trends in Generative AI Security (Domestic & International) & Introduction to AI Guardrail Product "chakoshi"
nttcom
4
1.5k
Do Ruby::Box dream of Modular Monolith?
joker1007
1
360
Rapid Start: Faster Internet Connections, with Ruby's Help
kazuho
2
810
AgentCore Managed Harness を使ってみよう
yakumo
2
240
MLOps導入のための組織作りの第一歩
akasan
0
390
M5Stack CoreS3とZephyr(RTOS)で Edge AIっぽいことしてみた
iotengineer22
0
350
UIライブラリに依存しすぎないReact Native設計を目指して
grandbig
0
150
Featured
See All Featured
Test your architecture with Archunit
thirion
1
2.2k
First, design no harm
axbom
PRO
2
1.2k
It's Worth the Effort
3n
188
29k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
130
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
9.9k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
440
The Cost Of JavaScript in 2023
addyosmani
55
9.9k
RailsConf 2023
tenderlove
30
1.4k
Building AI with AI
inesmontani
PRO
1
920
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
380
Faster Mobile Websites
deanohume
310
31k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Transcript
@ojun Overview: Swift OpenAPI Generator
ࣗݾհ
ࣗݾհ • name: ojun • 2023৽ଔೖࣾ • iOSΤϯδχΞ
ࠓൃද͢Δ͜ͱ
ࠓൃද͢Δ͜ͱ • Swift OpenAPI Generator ͷ overview • αʔόଆ &
ΫϥΠΞϯτଆͷ࣮ • ΞϓϦ։ൃͷࡍʹඞཁʹͳΔ͜ͱ • APIClientͷӅṭ • Headerͷೖ • Middlewareͷਂ۷Γ
• Swift OpenAPI Generator ͷ overview • αʔόଆ & ΫϥΠΞϯτଆͷ࣮
• ΞϓϦ։ൃͷࡍʹඞཁʹͳΔ͜ͱ • APIClientͷӅṭ • Headerͷೖ • Middlewareͷਂ۷Γ ࠓൃද͢Δ͜ͱ “https://developer.apple.com/videos/play/wwdc2023/10171/"ΑΓҾ༻
Swift OpenAPI Generator ͱʁ
Swift OpenAPI Generator ͱʁ • AppleʹΑͬͯ։ൃ͞Εͨ Swift Package Plugin •
OpenAPIυΩϡϝϯτ͔ΒSwiftͷΫϥΠΞϯτ͓ΑͼαʔόʔίʔυΛ ੜ͢Δ͜ͱ͕Մೳ • OpenAPI ͷ 3.0 ͱ 3.1 Ͱಈ࡞͢Δ
OpenAPIͷॏཁੑ • OpenAPIɺHTTPϕʔεͷAPIΛهड़͢ΔͨΊͷۀքඪ४ • JSON·ͨYAMLͰॻ͔ΕͨOpenAPIυΩϡϝϯτʹΑΓɺAPIͷߏ Λ໌֬ʹ͠ɺҟͳΔπʔϧͰͷࣗಈԽ͕ՄೳͱͳΔ
Swift OpenAPI Generatorͷత • APIݺͼग़͠ͰඞཁͱͳΔ͍ΘΏΔ”ّࣜతͳίʔυ”Λࣗಈੜ͢Δ͜ͱ • ίʔυϏϧυ࣌ʹੜ͞Εɺ͔ͭɺAPIυΩϡϝϯτͱৗʹಉظ͢Δ ͷͰϦϙδτϦʹίʔυΛؚΊΔඞཁ͕ͳ͘ͳΔ ࣗಈੜ
Swift OpenAPI Generatorͷత • APIݺͼग़͠ͰඞཁͱͳΔ͍ΘΏΔ”ّࣜతͳίʔυ”Λࣗಈੜ͢Δ͜ͱ • ίʔυϏϧυ࣌ʹੜ͞Εɺ͔ͭɺAPIυΩϡϝϯτͱৗʹಉظ͢Δ ͷͰϦϙδτϦʹίʔυΛؚΊΔඞཁ͕ͳ͘ͳΔ • ख࡞ۀʹΑΔAPIؔ࿈ίʔυͷهड़͔Βղ์͞ΕɺΑΓޮత͔ͭਖ਼֬
ʹϓϩδΣΫτΛਐΊΔΑ͏ʹͳΔ🎉
Swift OpenAPI Generatorͷಛ
Swift OpenAPI Generatorͷಛ • Swift Package Plugin • Ϗϧυ࣌ʹҎԼ͕ίʔυੜ͞ΕΔ •
Type safe ͳϓϩύςΟ • ೖग़ྗͷΤϯίʔυɾσίʔυॲཧ • ϦΫΤετͷੜ
αʔόଆͷ࣮
αʔόଆͷ࣮ • ΫϥΠΞϯτଆΛಈ࡞ͤ͞ΔͨΊʹVaporΛར༻ͨ͠ϩʔΧϧͰಈ࡞͢ ΔαʔόΛ࣮͢Δ
OpenAPIͷ༰ • શ༰ӈͷ௨Γ
OpenAPIͷ༰ • OpenAPIͷόʔδϣϯΛ هड़ • info͓Αͼserversͷ༰Λ هड़
OpenAPIͷ༰ • v1/welcome_message Λ࣮ • parameter ͱͯ͠ {name: String} Λड͚औΔ
• response ͱͯ͠ PixivAppNightMessageΛ ฦ͢
OpenAPIͷ༰ • PixivAppNightMessage {message: String}ΛؚΉ
None
BuildΛߦ͏ͱҎԼͷίʔυ͕ࣗಈੜ͞ΕΔ
APIProtocolʹ४ڌͨ͠ߏମΛ࣮͢Δ
APIProtocolʹ४ڌͨ͠ߏମΛ࣮͢Δ
APIProtocolʹ४ڌͨ͠ߏମΛ࣮͢Δ return ͕ෳࡶʹͳΔ
APIProtocolʹ४ڌͨ͠ߏମΛ࣮͢Δ
• ࣮ߦ ͢Δ͜ͱͰ ϩʔΧϧͷαʔό͕ ্ཱ͕ͪΔ 🎉 APIProtocolʹ४ڌͨ͠ߏମΛ࣮͢Δ
αʔόଆͷ࣮ 🎉
Clientଆͷ࣮
OpenAPIͷ࣮ • ϩʔΧϧͰͷ։ൃͳͷͰ ઐ༻ͷurlΛՃ͢Δ
None
Clientଆͷ࣮ 1. ClientͷॳظԽ 2. APIΛୟ͘ 3. responseͷղੳ
Clientଆͷ࣮ 1. ClientͷॳظԽ 2. APIΛୟ͘ 3. responseͷղੳ
Clientଆͷ࣮ 1. ClientͷॳظԽ 2. APIΛୟ͘ 3. responseͷղੳ
Clientଆͷ࣮ 1. ClientͷॳظԽ 2. APIΛୟ͘ 3. responseͷղੳ ࣮ߦ͢Δͱʮojun͞Μɺpixiv App NightΑ͏ͦ͜!ʯ͕ग़ྗ͞ΕΔ
Client ଆͷ࣮ 🎉
Swift OpenAPI GeneratorͷӅṭ
Swift OpenAPI GeneratorͷӅṭ • ݱࡏͷ࣮Ͱɺར༻ଆ͕ Swift OpenAPI Generator ʹґଘͨ͠ϝιο υΛݺͼग़͍ͯ͠Δ
→ ར༻ऀ͕Generatorͷ࣮ͷৄࡉΛΔඞཁ͕͋Δ • ͜Εղܾ͢ΔͨΊʹɺ৽͍͠ߏମΛಋೖ͠ɺSwift OpenAPI Generator ͷػೳΛϥοϓ͢Δ • ͜ΕʹΑΓSwift OpenAPI Generatorͷతͳґଘ͕ؔӅṭ͞Εɺ APIͷ༻͕ΑΓγϯϓϧʹͳΔ
Swift OpenAPI GeneratorͷӅṭ • APIClientΛఆٛ͢Δ
Swift OpenAPI GeneratorͷӅṭ • clientΛఆٛ͢Δ
Swift OpenAPI GeneratorͷӅṭ • clientΛఆٛ͢Δ • any APIProtocolͳclientΛ ఆٛ͠initͰॳظԽ͢Δ
Swift OpenAPI GeneratorͷӅṭ • clientΛఆٛ͢Δ • any APIProtocolͳclientΛ ఆٛ͠initͰॳظԽ͢Δ •
APIͷ͚ͩϝιουΛ࡞͠ ͦͷதͰAPIΛୟ͘
Swift OpenAPI GeneratorͷӅṭ • ෳͷ initializer Λఏڙ͠ έʔεʹԠͯ͡ݺͼग़͢ initializer ΛΓସ͑Δ
͜ͱͰ testable ͳ࣮ ʹͳΔ
Ӆṭ 🎉
HeaderͷՃ
HeaderͷՃ • APIΛୟ͘ࡍʹHeaderʹରͯ͠ ༷ʑͳΛՃ͢Δ͜ͱ͕͋Δ • Swift OpenAPI Generatorͷ ClientΛར༻͢ΔࡍHeaderΛ Ճ͢Δඞཁ͕͋Δ
ClientMiddleware
ClientMiddleware
ClientMiddleware
ClientMiddleware
ClientMiddleware
ClientMiddleware
ClientMiddleware
ClientMiddleware
࣮ࡍʹ࡞ͬͯΈΑ͏ʂ
None
None
None
None
None
None
None
None
HTTPField.NameΛࢦఆ͢Δ
HTTPField.Nameͱʁ
None
None
HTTPField.NameΛࢦఆ͢Δ
None
ΧελϜͳHTTPField.NameΛࢦఆ͍ͨ͠ • σϑΥϧτͰ“Appp-OS” “App-Version”ଘࡏ͍ͯ͠ͳ͍
• σϑΥϧτͰ“Appp-OS” “App-Version”ଘࡏ͍ͯ͠ͳ͍ • → ࣗ࡞͢Δඞཁ͕͋Δ ΧελϜͳHTTPField.NameΛࢦఆ͍ͨ͠
None
None
ຖճมʹೖΕΔͷ͕໘
ConsumingΩʔϫʔυΛ༩͢Δ ͜ͱͰճආͰ͖Δ
༩Ͱ͖Δͷ͕ίϯύΠϥͷόά Ͱ͋ΔՄೳੑ͋Δ ConsumingΩʔϫʔυΛ༩͢Δ ͜ͱͰճආͰ͖Δ
HeaderInjectionMiddleware ͷ 🎉
࡞ͨ͠ Middleware ͷࢦఆ
None
None
Middleware ͷਂ۷Γ
None
Transport ͱ Middlewareͷҧ͍ʁ
Transport • ࣮ࡍʹωοτϫʔΫΛ༻͠ɺHTTPૢ࡞Λ࣮ߦ͢Δ(جຊͱͳΔ)HTTP ϥΠϒϥϦΛநԽ͢Δ • ҎԼͷ2ͭͷ߹ custom transport ͷ࣮Λݕ౼͢Δͱྑ͍ •
ΈͷHTTPϥΠϒϥϦʹରԠ͢ΔΫϥΠΞϯττϥϯεϙʔτ͕·ͩ ଘࡏ͠ͳ͍߹ • ςετͰ͍͠ωοτϫʔΫ݅ΛγϛϡϨʔτ͢Δඞཁ͕͋Δ߹
ClientMiddleware • transport ʹҾ͖͞ΕΔલͷϦΫΤετͱɺtransport ʹΑͬͯ͞Ε ͨޙͷϨεϙϯεΛಡΈऔΓɺมߋ͢Δ͜ͱ͕Ͱ͖Δ • HTTPϦΫΤετͱϨεϙϯεΛड͚औΔ͕ɺࣗͰHTTPૢ࡞Λ࣮ߦ͢ Δଘࡏ͠ͳ͍ •
Ώ͑ʹɺϛυϧΣΞՃͷ next ύϥϝʔλΛऔΓɺHTTPίʔϧ ΛϛυϧΣΞελοΫͷઌ಄ʹ͋Δ transport ʹҕৡ͢Δ
ClientMiddleware • ೝূɺϩάهɺϝτϦΫεɺτϨʔγϯάɺΧελϜϔομͷೖΛ ߦ͏͜ͱʹద͍ͯ͠Δ • ·ͨɺҎԼͷΑ͏ͳςετʹద͍ͯ͠Δ • ࣮ࡍͷαʔόʔͷϦΫΤετ࣌ʹϥϯμϜͳࣦഊΛೖ • ͦͷঢ়گΛར༻ͯ͠ɺϦτϥΠΤϥʔϋϯυϦϯάͷϩδοΫΛς
ετ͢Δ͜ͱ
ॲཧͷॱং ʢAPIϦΫΤετૹ৴࣌ʣ
ॲཧͷॱংʢAPIϦΫΤετૹ৴࣌ʣ • [Middleware] ͷ্͔Β࣮ߦ • ྃޙɺtarnsport͕࣮ߦ͞ΕΔ
None
1
1 2
1 2 3
1 2 3 4
1 2 3 4 OpenAPIRuntime/Interface/UniversalClient.swift Ͱ࣮͞ΕͯΔ
Ҿʹnext͕ଘࡏͨ͠ཧ༝ͱ return ͢Δࡍʹ next Λࢦఆ͍ͯͨ͠ཧ༝͕ݟ͑ͯ͘Δ
ॲཧͷॱং ʢϨεϙϯεड৴࣌ʣ
ॲཧͷॱংʢϨεϙϯεड৴࣌ʣ • ࠷ॳʹtarnsport͕࣮ߦ͞ΕΔ • ྃޙɺ[Middleware] ͷԼ͔Βॱ࣮࣍ߦ͞ΕΔ • * Կ͔ࢼ͕ͨ͠ɺϨεϙϯεड৴࣌ʹͦͦMiddleware͕࣮ߦ ͞Εͳ͔ͬͨ
·ͱΊ
·ͱΊ • Swift OpenAPI Generator Λར༻͢Δ͜ͱͰɺAPIݺͼग़͠αʔόʔ࣮ ʹඞཁͳίʔυΛࣗಈੜ͠ɺ։ൃऀ͕ख࡞ۀΛলུͯ͠ޮత͔ͭ ਖ਼֬ʹϓϩδΣΫτΛਐΊΒΕΔΑ͏ʹͳΔ • Generatorͷ࣮ͷৄࡉΛӅͨ͢Ίʹclient෦Λϥοϓ͢Δ
·ͱΊ • ClientMiddlewareΛར༻ͯ͠HeaderΛࢦఆ͢Δ • ΧελϜͳHeaderHTTPField.NameΛ֦ு͢Δ • MiddlewareΛ͏͜ͱͰೝূɺϩάهͳͲ༷ʑͳ͜ͱΛߦ͑Δ • transportͱmiddlewareͷҧ͍Λཧղ͠ɺదͳΧελϜߏମΛ࡞ ͢Δ͜ͱ͕ॏཁ
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ