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
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
58k
サーキットブレーカー 〜 有料契約店舗数 国内 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
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8.6k
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
1
150
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
120
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
2
1.1k
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
160
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
290
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
3
720
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
35
17k
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
180
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.8k
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
200
Compiling a real-world CLI tool to native with Static Hermes
tmikov2023
0
130
Featured
See All Featured
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Paper Plane
katiecoart
PRO
5
54k
Claude Code のすすめ
schroneko
67
230k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Building Adaptive Systems
keathley
44
3.3k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
580
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
[SF Ruby Conf 2025] Rails X
palkan
3
1.5k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
540
Code Reviewing Like a Champion
maltzj
529
40k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
480
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ਓ͕ؒॻ͍ͨίʔυ͚ͩςετ͢Εྑ͍
ϨϏϡʔ͓ئ͍͠·͢