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
プライベートAPIのクライアントをいい感じにしたい / pepabo_ec_tech_mtg02
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Akihito Nakano
May 16, 2017
Programming
2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
プライベートAPIのクライアントをいい感じにしたい / pepabo_ec_tech_mtg02
2017/05/16 第2回 EC事業部 Tech MTG
Akihito Nakano
May 16, 2017
More Decks by Akihito Nakano
See All by Akihito Nakano
OpenAPI Generator Meetup #1
akihito_nakano
1
1.5k
Libraの現状と技術面をざっくりと / astudy20191114
akihito_nakano
4
1.2k
カート刷新プロジェクトにおけるOpenAPIを活用したコード自動生成の今と明日 / astudy20190419
akihito_nakano
2
700
平静を保ち、コードを生成せよ 〜 OpenAPI Generator誕生の背景と軌跡 〜 / gunmaweb34
akihito_nakano
25
57k
サーキットブレーカー 〜 有料契約店舗数 国内 No.1 ECサービスに神を宿す 〜 / pepabo_ec_tech_mtg01
akihito_nakano
1
4.6k
並行・並列処理のテストは難しい
akihito_nakano
2
5k
並列処理で消耗しているかたへ - Snidel のご紹介 -
akihito_nakano
4
3.7k
Other Decks in Programming
See All in Programming
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
270
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
9
7.4k
アクセシビリティから考える情報設計
high_g_engineer
0
380
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
2
290
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
380
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
2.5k
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
640
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
190
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
500
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
130
wkhtmltopdfの次どうするか問題2026
willnet
2
1.6k
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
560
Featured
See All Featured
It's Worth the Effort
3n
188
29k
Marketing to machines
jonoalderson
1
5.8k
30 Presentation Tips
portentint
PRO
1
400
Amusing Abliteration
ianozsvald
1
310
Making Projects Easy
brettharned
120
6.8k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
410
Exploring anti-patterns in Rails
aemeredith
4
510
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Docker and Python
trallard
47
4.2k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
Typedesign – Prime Four
hannesfritz
42
3.2k
Transcript
தڿਓ(.01&1"#0JOD ୈճ&$ࣄۀ෦5FDI.5( ϓϥΠϕʔτ"1*ͷΫϥΠΞϯτΛ ͍͍ײ͡ʹ͍ͨ͠
8&#ΞϓϦέʔγϣϯΤϯδχΞ &$ࣄۀ෦Χϥʔϛʔγϣοϓάϧʔϓ தڿਓ ͖͋ͬʔ !/","/0@"LJIJUP ಛ߈ୂνʔϜ IUUQTBDLJOUPTIHJUIVCJP
࣍ wղܾ͍ͨ͜͠ͱ wཧ w࣮ݱ·Ͱͷϋʔυϧ wϨϏϡʔґཔ
ղܾ͍ͨ͜͠ͱ
ΧΦεԽ͖͍ͯͯ͠Δ
ϓϥΠϕʔτ"1*ΫϥΠΞϯτͷݱঢ় w ࣮ʹ౷Ұײ͕ͳ͍ w +40/Λσίʔυ͚ͨͩ͠ͷσʔλΛฦ͢ͷ͋ΕɺϞσϧ૬ͷΠϯελϯεΛฦ͢ͷ ͋Δ w ෳͷϦϙδτϦʹࢄ࣮ͯ͠͞Ε͍ͯΔ w ͦΕͧΕʹ"1*Λୟͨ͘ΊͷɾࢠΫϥε͕ଘࡏ͢Δ
w ผͷϦϙδτϦͷΫϥεΛܧঝͯ͠Δͷ͋Δ w Ϣχοτςετͷϝϯςφϯείετ w "1*ͷ༷Λม͑ͨΒQIQWDSͷϑΟΫενϟਓؒͷखͰमਖ਼͠ͳ͍ͱ͍͚ͳ͍ w ಉ͡Α͏ͳςετ͕ͨ͘͞Μ͋Δ
ΧΦεԽ·ͩ࢝·͔ͬͨΓ ͍·ͷ͏ͪʹखΛଧ͍ͪͨ
ཧ
4XBHHFS$PEFHFO
4XBHHFS$PEF(FOFSBUPS wIUUQTXBHHFSJPTXBHHFSDPEFHFO w0QFO"1*4XBHHFSʹԊͬͨఆ͔ٛΒ৭ʑͳݴޠɾϑϨʔϜϫʔΫͷαʔ όʔɺΫϥΠΞϯτɺςετελϒΛੜͰ͖Δ w࠷৽W wW ͦΖͦΖϦϦʔε ͔Β(V[[MF 143 Λ)551ΫϥΠΞϯτͱͯ͠
ར༻͍ͯ͠Δ w1)1Ҏ্
ΠϯετʔϧʙΫϥΠΞϯτੜ $ brew install swagger-codegen $ swagger-codegen generate \ -i
http://petstore.swagger.io/v2/swagger.json \ -l php \ -o . ಛఆͷόʔδϣϯΛ͍͍ͨ߹ $ git clone https://github.com/swagger-api/swagger-codegen $ ./run-in-docker.sh mvn package $ ./run-in-docker.sh generate \ -i http://petstore.swagger.io/v2/swagger.json \ -l php \ -o .
ੜ͞ΕΔϑΝΠϧ WҰ෦ൈਮ ├── lib │ ├── Api │ │ ├──
PetApi.php │ │ ├── StoreApi.php │ │ └── UserApi.php │ ├── ApiClient.php │ ├── Model │ │ ├── ApiResponse.php │ │ ├── Category.php │ │ ├── Order.php │ │ ├── Pet.php │ │ ├── Tag.php │ │ └── User.php
ϖοτετΞͷTXBHHFSKTPO { "paths": { "/pet/{petId}": { "get": { "operationId": “getPetById",
…… "definitions": { "Pet": { "type": "object", "properties": { "category": { "$ref": "#/definitions/Category" },
QFU\QFU*E^ͷϨεϙϯε { "id": 1, "category": { "id": 1, "name": "string"
}, "name": "doggie", "photoUrls": [ "string" ], "tags": [ { "id": 1,
ΫϥΠΞϯτͷ͍৺ (new \Swagger\Client\Api\PetApi)->getPetById(1); class Swagger\Client\Model\Pet#9 (1) { protected $container =>
array(6) { 'id' => int(1) 'category' => class Swagger\Client\Model\Category#10 (1) {
ΫϥΠΞϯτͷ͍৺ (new \Swagger\Client\Api\PetApi)->findPetsByStatus('sold') array(1424) { [0] => class Swagger\Client\Model\Pet#4239 (1)
{ } [1] => class Swagger\Client\Model\Pet#4243 (1) {
࣮ઓೖΛఆͨ͠՝ wϞσϧʹ࣮ΛՃ͍͑ͨ w$JSDVJU#SFBLFSΛ͍͍ͨ w4XBHHFS$PEFHFO $JSDVJU#SFBLFS (BOFTIB w IUUQTBDLJOUPTIHJUIVCJPCMPHTXBHHFSDPEFHFOXJUIHBOFTIB
ϋʔυϧ
࣮ݱ·Ͱͷϋʔυϧ w 0QFO"1*Ͱఆٛ͢Δ w ҰؾʹΔඞཁແ͍ͷͰͬͯ͘ w ϩʔΧϧڥͷվળ w 13͕͋ΔͷͰؤுΔʢՃ͓ئ͍͠·͢QSBZʣ w
࣮ઓೖΛఆͨ͠՝ w .PEFMʹ࣮ΛՃ͍͑ͨ߹Ͳ͏͢Δʁ w $JSDVJU#SFBLFSΛ͍͍ͨ߹Ͳ͏͢Δʁ w ӡ༻Ͳ͏͢Δʁ ࣍ͷεϥΠυ
ίʔυࣗಈੜͷϓϥΫςΟε w(FOFSBUJPO(BQύλʔϯ wIUUQTNBSUJOGPXMFSDPNETM$BUBMPHHFOFSBUJPO(BQIUNM wIUUQXXXIZVLJDPNEQEQJOGPIUNM(FOFSBUJPO(BQ wlॻ͖Ճ͑ͯͨ෦͕ফ͑ͯΔʜzΛ͙ wࣗಈੜ͞Εͨίʔυͱਓ͕ؒॻ͍ͨίʔυΛ͢Δ wੜ͞ΕͨίʔυͷαϒΫϥεʹਓ͕࣮ؒΛՃ͑Δ
.PEFMʹ࣮ΛՃ͍͑ͨ߹ͬͯʁ ࣮ྫͱͯ͠ɺطଘͷ.PEFMͷ࣮ΛݟͯΈΔ
(FOFSBUJPO(BQύλʔϯΛద༻͍͕ͨ͠ʜ (new \Swagger\Client\Api\PetApi)->getPetById(1); // class Swagger\Client\Model\Pet w1FUϞσϧʹखΛೖΕ͍ͨ w1FU"QJͷฦΓ͕1FUϞσϧ w1FUͷαϒΫϥεΛར༻͢Δ༨͕ແ͍ʜ
࣮ઓೖΛఆͨ͠՝ .PEFMʹ࣮ΛՃ͍͑ͨ wΦϦδφϧςϯϓϨʔτͱϑΝΫτϦΛ͏ wΦϦδφϧςϯϓϨʔτ wਓ͕ؒॻ͘αϒΫϥεΛར༻͢ΔͨΊͷԼΛ࡞Δ wϑΝΫτϦ w"1*ΫϥεͷੜΛ୲͢Δ w"1*Ϋϥε͕ฦ͖͢ϞσϧΛཧͤ͞Δ
.PEFMʹ࣮ΛՃ͍͑ͨΦϦδφϧςϯϓϨʔτ class PetApi { public function __construct( ClientInterface $client =
null, Configuration $config = null, HeaderSelector $selector = null, $modelClass = null w ಠࣗͷίʔυੜςϯϓϨʔτΛ༻ҙͯ͠ੜ͞ΕΔίʔυΛΧελϚΠζ͢Δ w TXBHHFSDPEFHFOHFOFSBUFͷUΦϓγϣϯ w ࣮ߦ݁Ռͱͯ͠ฦ͢ϞσϧΫϥεΛࠩ͠ସ͑ΒΕΔΑ͏ʹ͢ΔͨΊʹ࠷খݶͷΧ ελϚΠζΛ͢Δ
.PEFMʹ࣮ΛՃ͍͑ͨΦϦδφϧςϯϓϨʔτ Πϝʔδ
.PEFMʹ࣮ΛՃ͍͑ͨϑΝΫτϦ w ࣮ߦ݁Ռͱͯ͠ฦ͖͢ϞσϧΫϥεΛཧͤ͞Δ ApiFactory::instantiate(‘PetApi’)->getPetById(1); // class ……\Model\HandWrittenPet class ApiFactory {
private static $map = [‘PetApi’ => ‘HandWrittenPet’]; public static function instantiate($apiClass) { …… return new $apiClass(… , $modelClass);
.PEFMʹ࣮ΛՃ͍͑ͨϑΝΫτϦ Πϝʔδ
.PEFMʹ࣮ΛՃ͍͑ͨ ApiFactory::instantiate(‘PetApi’)->getPetById(1); // class Swagger\Client\Model\HandWrittenPet (new \Swagger\Client\Api\PetApi)->getPetById(1); // class Swagger\Client\Model\Pet
ϏϑΥʔ Ξϑλʔ ΦϦδφϧςϯϓϨʔτ ϑΝΫτϦͰ (FOFSBUJPO(BQύλʔϯΛద༻༷ͨ͠ࢠ
࣮ઓೖΛఆͨ͠՝ $JSDVJU#SFBLFSΛ͍͍ͨ wϑΝΫτϦΛ͏ w"1*ΫϥεΛ࡞Δͱ͖ʹɺ$JSDVJU#SFBLFSΛΈࠐΜͩ)551ΫϥΠΞ ϯτΛηοτ͢Δ
$JSDVJU#SFBLFSΛ͍͍ͨ class ApiFactory { public static function instantiate($apiClass) { ……
return new $apiClass($httpClientWithCB, … , $modelClass); w༧Ί$JSDVJU#SFBLFSΛΈࠐΜͩΫϥΠΞϯτ͕ηοτ͞Εͨ"1*Πϯελ ϯεΛฦ͢ w IUUQTBDLJOUPTIHJUIVCJPCMPHTXBHHFSDPEFHFOXJUIHBOFTIB w "QJ$MJFOUΛܧঝͨ͠ΫϥεΛ༻ҙ͢Δํ๏
$JSDVJU#SFBLFSΛ͍͍ͨ Πϝʔδ
ӡ༻ w ϓϥΠϕʔτ"1*ΫϥΠΞϯτઐ༻ͷϦϙδτϦΛ࡞Δ w ཁٻ͞ΕΔ1)1όʔδϣϯ͕ҧ͏ͷͰڞ༗ϦϙδτϦʹೖΕΒΕͳ͍ w Ϣχοτςετ w ਓ͕ؒॻ͘ίʔυ͚ͩςετΛॻ͚ྑ͍ͷͰ w
"1*ఆٛͱੜ͞ΕΔίʔυඞͣҰக͢Δ w "1*ͷৼΔ͍"1*ଆͷςετ͕อূ͢Δ w ։ൃͷྲྀΕ w "1*Λ࣮͢Δʗ0QFO"1*ͷఆٛΛॻ͘ w ΫϥΠΞϯτΛੜ͢ΔʗαϒΫϥεͷ࣮͕ඞཁͳΒΔ ςετΛॻ͘
ݱঢ়ˠ4XBHHFS$PEFHFOΛ͏ͱ w࣮ʹ౷Ұײ͕ͳ͍ wੜ͞ΕΔίʔυͰ͕උ͞Εɺ౷Ұײ͕ͰΔ wෳͷϦϙδτϦʹࢄ࣮ͯ͠͞Ε͍ͯΔ wઐ༻ͷϦϙδτϦʹ౷Ұ wϢχοτςετͷϝϯςφϯείετ wਓ͕ؒॻ͍ͨίʔυ͚ͩςετ͢Εྑ͍
ϨϏϡʔ͓ئ͍͠·͢