SlideShare ist ein Scribd-Unternehmen logo
1 von 169
Downloaden Sie, um offline zu lesen
Alessandro Cinelli (cirpo) 
Don’t screw it up! 
how to build durable apis
How to build 
durable 
web APIs
1. Can you predict 
the future?
Dubai Marina ~2000
Dubai Marina 2014
CAN YOU REALLY PREDICT THE FUTURE?
If there’s one thing we learned over the 
past 5 years of development...
Monoliths are disappearing
FULL STACK IS DEAD! 
Microservice Architecture, [...] a 
particular way of designing software 
applications as suites of independently 
deployable services 
http://martinfowler.com/articles/microservices.html
FULL STACK IS DEAD! 
SERVICE-ORIENTED 
ARCHITECTURES 
Microservice Architecture, [...] a 
particular way of designing software 
applications as suites of independently 
deployable services 
http://martinfowler.com/articles/microservices.html
LEGO, something new in a geek talk…
FROM 
a single page application written in
TO 
an hybrid solution
IN TWO WEEKS!!!
HOW?
APIs written in PHP <3
EVERYONE WANTS API
EVERYDAY SERVICES
DEV-ORIENTED SERVICES
API MANIACS
2. HTTP IS HERE 
TO STAY
GET vs POST 
“The difference is that in 
a GET request you have the parameters in 
the url , 
with a POST the parameters are in the 
request’s body”
GET vs POST
HTTP FUNDAMENTALS
HTTP FUNDAMENTALS 
GET POST
HTTP FUNDAMENTALS 
PATCH DELETE 
GET POST 
PUT HEAD 
OPTIONS
HTTP FUNDAMENTALS 
HEADERS
HTTP FUNDAMENTALS 
Cache-Control 
Cookie Accept-Language 
User-Agent Origin 
HEADERS 
Accept 
Accept-Encoding 
Content-Type 
Referer 
If-Modified-Since 
If-None-Match
HTTP FUNDAMENTALS 
CUSTOM HEADERS
HTTP FUNDAMENTALS 
CUSTOM HEADERS 
N-Location 
N-Locale 
N-Device 
N-Platform 
N-App 
N-Theme
WAKA 
“A new protocol designed to match 
the efficiency of well-designed 
Web Applications” 
http://tools.ietf.org/agenda/83/slides/slides-83-httpbis-5.pdf
SPDY/1…3 
A protocol “invented” by Google, which supports: 
extended compression 
multiplexing 
prioritization 
server push
SPDY/1…3 
A protocol “invented” by Google, which supports: 
extended compression 
multiplexing 
prioritization 
server push
SPDY/1…3 
A protocol “invented” by Google, which supports: 
extended compression 
multiplexing 
prioritization 
server push
SPDY/1…3 
A protocol “invented” by Google, which supports: 
extended compression 
multiplexing 
prioritization 
server push
HTTP/2.0
HTTP/2.0 
BASED ON SPDY
HTTP/2.0 
WHICH IS A FASTER VERSION OF HTTPS
HTTP/2.0 
WHICH IS A SAFER VERSION OF HTTP
HTTP is definitely here to stay, 
semantics won’t change
3. PLAN FOR 
FAILURE
WORK AROUND BUGS
WORK AROUND BUGS
FAILOVER 
HTTP/1.1 200 OK 
Date: Fri, 25 Apr 2014 16:52:37 GMT 
Content-Type: application/json 
Transfer-Encoding: chunked 
Connection: keep-alive 
Vary: Accept-Encoding 
Cache-Control: stale-if-error=3600, stale-while-revalidate=6000 
Age: 0 
Via: 1.1 varnish 
X-Cache: MISS 
Alternate-Protocol: 443:npn-spdy/2
FAILOVER 
HTTP/1.1 200 OK 
Date: Fri, 25 Apr 2014 16:52:37 GMT 
Content-Type: application/json 
Transfer-Encoding: chunked 
Connection: keep-alive 
Vary: Accept-Encoding 
Cache-Control: stale-if-error=3600, stale-while-revalidate=6000 
Age: CACHE 0 
AVAILABLE IF BACKEND IS DOWN 
Via: 1.1 varnish 
X-Cache: MISS 
Alternate-Protocol: 443:npn-spdy/2
DESIGN MISTAKES?
VERSIONING TO THE RESCUE
VERSIONING TO THE RESCUE
VERSIONING TO THE RESCUE
VERSIONING TO THE RESCUE
How to detect the version?
http://api.example.com/v1/… 
How to detect the version?
SIMPLE 
How to detect the version?
BUT HOW TO DETECT IT? 
How to detect the version?
DETECTING THE VERSION
DETECTING THE VERSION 
Here it belongs to 
the route/controller, you need 
it at the 
Request level
USE A HEADER! 
How to detect the version?
DETECTING THE VERSION
LET NGINX DO THE JOB
LET NGINX DO THE JOB 
$req->getHeader(‘API-Version)
LET NGINX DO THE JOB 
api.example.com/v1/customers
LET NGINX DO THE JOB 
api.example.com/customers 
API-Version: 1
LET NGINX DO THE JOB 
Without polluting 
your router or controller class
“I beg to differ”
“I beg to differ” 
URL, subdomain, 
media type, header...
“I beg to differ” 
Picking a wrong 
implementation 
doesn’t matter
“I beg to differ” 
AT ALL.
“I beg to differ” 
How it impacts the 
design of your 
software matters
4. BE PRAGMATIC
GET or POST?
GET or POST? 
api. example.com/login/?username=cirpo&login=wunderbar
5.TESTING
cURL is your best friend 
curl -X GET https://api.example.com/products 
curl -X POST https://api.example com/order -data=”{...}” 
curl -X DELETE ... 
curl -X PATCH ...
cURL is your best friend
PHP 
cuzzle 
cURL command 
from Guzzle requests 
github.com/namshi/cuzzle
cURL is your best friend
cURL is your best friend
cURL is your best friend
HTTPARTY
HTTPIE
Javascript 
mockserver 
mock your APIs 
in a matter of seconds! 
github.com/namshi/mockserver
Javascript 
mockserver
Javascript 
users_GET.mock file 
mockserver
Javascript 
mockserver
TESTING APIS
Android 2.3 native browser…
TESTING APIS
TESTING APIS 
you can even 
decrypt the https responses :)
Javascript 
shisha 
smoke tests made easy! 
github.com/namshi/shish
Javascript 
shisha 
.smoke file
Javascript 
shisha
6. DESIGN
An API is a layer on 
top of your domain
Pick the layer that 
is most suitable 
to your needs
HTTP APIs are a 
good start
REST IS A DREAM!
HTTP METHOD 
POST or PUT?
HTTP METHOD 
PUT or PATCH?
USER TAGS 
/users/johnny/tags
USER TAGS 
deleting a non-existent tag: 
200, 204 or 404?
USER TAGS 
ON STACKOVERFLOW 
THEY’RE 
deleting a non-existent tag: 
STILL FIGHTING 
200, 204 or 404? 
http://stackoverflow.com/questions/2342579/http-status-code-for-update- 
and-delete
be consistent
NAMING 
/user/1 
/users 
/order/1 
/orders
NAMING 
/city/1 
/cities 
/curriculum/1 
/curricula
NAMING 
/user/1 
/users 
/order/1 
/orders 
/city/1 
/cities 
/curriculum/1 
/curricula
NAMING 
/user/1 
/users 
/order/1 
/orders 
/city/1 
/cities 
/curriculum/1 
/curricula 
NOT GOD AT ALL!
STICK WITH PLURALS!
NAMING 
/users1 
/users 
/orders/1 
/orders
NAMING 
/cities/1 
/cities 
/curricula/1 
/curricula
NAMING 
/users/1 
/users 
/orders/1 
/orders 
/cities/1 
/cities 
/curricula/1 
/curricula
UNIQUE RESOURCES 
/users/1 
/users/cirpo 
/users/A323K833
UNIQUE RESOURCES 
/orders/15 
/orders/A323K833
UNIQUE RESOURCES 
/orders/15 
AVOID INCREMENTAL 
NUMBERS 
/orders/A323K833 
IF IT’S BUSINESS CRITICAL
Unstructured APIs 
= 
API aggregation
api.example.org/v1/latest-news
latest news + 
metatags + 
banners + 
navigation 
yada yada yada
Sort of a “wild” API 
for your whole app
The client receives a GET 
on /something 
and will let the 
API figure out 
what /u/something 
actually is
Orchestration Layers
https://engineering.groupon.com/2013/misc/i-tier-dismantling-the-monoliths/
“Most APIs are designed by the API 
provider with the goal of maintaining data 
model purity. When building an OL, be 
prepared to sometimes abandon purity in 
favor of optimizations and/or 
performance.” 
Daniel Jacobson, 
director of engineering 
for the Netflix API 
http://www.infoq.com/presentations/API-Revolution
DOMAIN 
users 
orders 
stock 
images
DOMAIN 
Think about collections 
not 
controllers
DOMAIN 
PUT/PATCH 
try to always plan for full updates
UNIFORM RESPONSES
CODEBASE ORGANIZATION
CODEBASE ORGANIZATION 
one bundle for each api? 
one bundle for each application? 
one app for each sets of api?
CODEBASE ORGANIZATION 
start with an app 
organize bundles semantically 
create shared bundles
CODEBASE ORGANIZATION 
BUNDLES 
product 
checkout 
warehouse 
generic 
entity
CODEBASE ORGANIZATION 
APP 
product 
BUNDLES 
checkout 
warehouse 
generic 
entity
7. SCALABILITY
CACHE ALL THE THINGS!
MIDDLEWARE
MIDDLEWARE - CONNECT
MIDDLEWARE - STACK
AVOID SESSIONS
EVERYTHING AS A RESOURCE
8. ISSUES
CORS
CORS
(silly) browsers
if a cross-domain 
request is cacheable, 
the android browser 
goes nuts 
(silly) browsers
The request does 
not include 
the Origin header 
(silly) browsers
Status code: 0 
(silly) browsers
WHAT. THE. HECK. 
http://opensourcehacker.com/2011/03/20/android-webkit-xhr-status-code-0-and-expires-headers/ 
(silly) browsers
“standards”
Don’t play with fire
1 API, N clients 
consuming it 
Don’t play with fire
desktop browser, 
mobile browser, 
ios app, android app... 
Don’t play with fire
Keep as much logic 
as possible on the 
server 
Don’t play with fire
Less things to 
implement on every 
client and centralized 
implementations 
Don’t play with fire
make it easy for the 
API clients 
Don’t play with fire
POST https://api.example.com/login 
200 OK 
date: Thu, 01 May 2014 21:52:33 GMT 
content-type: application/json 
transfer-encoding: chunked 
connection: close 
set-cookie: login=...; 
cache-control: no-cache 
Don’t play with fire 
{ 
“email"=>"alessandro.cinelli@gmail.com", 
"firstName"=>"Alessandro", 
"lastName"=>"Cinelli", 
“birthday”=>"14/09/1985", 
}
Security matters
[ 
"odino@gmail.com", 
"cirpo@gmail.com", 
... 
] 
Security matters
for(;;);[ 
"odino@gmail.com", 
"cirpo@gmail.com", 
... 
] 
Security matters
while(1);[ 
"odino@gmail.com", 
"cirpo@gmail.com", 
... 
] 
Security matters
while(1);[ 
"odino@gmail.com", 
"cirpo@gmail.com", 
... 
] 
Security matters
Avoid [...] 
http://bit.ly/json-hijacking 
Security matters
USE {…} 
Security matters
That’s all folks
/ 
github.com/cirpo 
@cirpo
tech.namshi.com/join-us 
we are hiring! 
tech.namshi.com 
github.com/namshi 
twitter.com/TechNamshi
THANKS
CREDITS 
http://www.panoramio.com/photo/30329016 
https://farm3.staticflickr.com/2199/2365883747_3a5c753719_o.jpg 
http://news.buzzbuzzhome.com/2013/04/top-7-aerial-photos-cities.html 
https://www.flickr.com/photos/superlekker/5917559189/sizes/l 
https://www.flickr.com/photos/derekbruff/12336187505/sizes/l 
https://www.flickr.com/photos/chberge/3803475294/sizes/l 
https://www.flickr.com/photos/neilsingapore/8057578769 
https://www.flickr.com/photos/dionnehartnett/6805481856/sizes/l 
https://www.flickr.com/photos/thomashawk/186339737 
https://www.flickr.com/photos/cesarastudillo/3981364314/sizes/l 
https://www.flickr.com/photos/an_untrained_eye/6630719431 
https://www.flickr.com/photos/30835738@N03/7936491790/sizes/l 
https://www.flickr.com/photos/deboni/2959228565/sizes/l 
https://www.flickr.com/photos/ghalog/6782751111/sizes/l 
https://www.flickr.com/photos/timzim/177640262/sizes/o/ 
https://www.flickr.com/photos/innoxiuss/2824204305 
https://www.flickr.com/photos/hawk59/6038847752/sizes/l 
https://www.flickr.com/photos/remydwd/5487417702/sizes/l 
https://www.flickr.com/photos/rammorrison/4359793666/sizes/o/ 
https://www.flickr.com/photos/piers_nye/2501994750/sizes/o/ 
https://www.flickr.com/photos/danielygo/7559750132/sizes/l 
https://www.flickr.com/photos/msc72/2600035028/sizes/l 
https://www.flickr.com/photos/sicilianitaliano/3609275241/sizes/l 
https://www.flickr.com/photos/scottmontreal/7235110028/sizes/l 
https://www.flickr.com/photos/piet_musterd/6170853224/sizes/l 
https://www.flickr.com/photos/music_embassy/7137413247/sizes/l 
http://upload.wikimedia.org/wikipedia/commons/9/9c/William_James_b1842c.jpg 
http://theverybesttop10.files.wordpress.com/2013/08/the-world_s-top-10-things-no-person-with-a-ocd-should-see-1.jpg 
https://www.flickr.com/photos/62244271@N03/8553590682/sizes/l

Weitere ähnliche Inhalte

Was ist angesagt?

Beginning MEAN Stack
Beginning MEAN StackBeginning MEAN Stack
Beginning MEAN Stack
Rob Davarnia
 

Was ist angesagt? (20)

Phalcon Framework: San Antonio Web Developers Group
Phalcon Framework: San Antonio Web Developers Group Phalcon Framework: San Antonio Web Developers Group
Phalcon Framework: San Antonio Web Developers Group
 
The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)The next step from Microsoft - Vnext (Srdjan Poznic)
The next step from Microsoft - Vnext (Srdjan Poznic)
 
Monorepo: React + React Native. React Alicante
Monorepo:  React + React Native. React Alicante Monorepo:  React + React Native. React Alicante
Monorepo: React + React Native. React Alicante
 
Blazor v1.1
Blazor v1.1Blazor v1.1
Blazor v1.1
 
Complete guide of python development
Complete guide of python developmentComplete guide of python development
Complete guide of python development
 
Codegen2021 blazor mobile
Codegen2021 blazor mobileCodegen2021 blazor mobile
Codegen2021 blazor mobile
 
Engage 2019: The good, the bad and the ugly: a not so objective view on front...
Engage 2019: The good, the bad and the ugly: a not so objective view on front...Engage 2019: The good, the bad and the ugly: a not so objective view on front...
Engage 2019: The good, the bad and the ugly: a not so objective view on front...
 
Beginning MEAN Stack
Beginning MEAN StackBeginning MEAN Stack
Beginning MEAN Stack
 
Modern Web Application Development Workflow - EclipseCon France 2014
Modern Web Application Development Workflow - EclipseCon France 2014Modern Web Application Development Workflow - EclipseCon France 2014
Modern Web Application Development Workflow - EclipseCon France 2014
 
WordPress 4.4 and Beyond
WordPress 4.4 and BeyondWordPress 4.4 and Beyond
WordPress 4.4 and Beyond
 
Untangling spring week12
Untangling spring week12Untangling spring week12
Untangling spring week12
 
Ultra-modern Front-end Dev & Introducing Spar
Ultra-modern Front-end Dev & Introducing SparUltra-modern Front-end Dev & Introducing Spar
Ultra-modern Front-end Dev & Introducing Spar
 
A Gentle Introduction to Blazor
A Gentle Introduction to BlazorA Gentle Introduction to Blazor
A Gentle Introduction to Blazor
 
Modern Web Applications Utilizing HTML5 (Dev Con TLV 06-2013)
Modern Web Applications Utilizing HTML5 (Dev Con TLV 06-2013)Modern Web Applications Utilizing HTML5 (Dev Con TLV 06-2013)
Modern Web Applications Utilizing HTML5 (Dev Con TLV 06-2013)
 
Web development with Python
Web development with PythonWeb development with Python
Web development with Python
 
DevDay 2018 - Blazor
DevDay 2018 - BlazorDevDay 2018 - Blazor
DevDay 2018 - Blazor
 
Basic concepts for python web development
Basic concepts for python web developmentBasic concepts for python web development
Basic concepts for python web development
 
MEAN Stack
MEAN Stack MEAN Stack
MEAN Stack
 
Introduction to ASP.NET Core
Introduction to ASP.NET CoreIntroduction to ASP.NET Core
Introduction to ASP.NET Core
 
PWA basics for developers
PWA basics for developersPWA basics for developers
PWA basics for developers
 

Ähnlich wie Don't screw it up! How to build durable API

Don't screw it up: how to build durable web apis @ PHPDay 2014 in Verona (ITA)
Don't screw it up: how to build durable web apis @ PHPDay 2014 in Verona (ITA)Don't screw it up: how to build durable web apis @ PHPDay 2014 in Verona (ITA)
Don't screw it up: how to build durable web apis @ PHPDay 2014 in Verona (ITA)
Alessandro Nadalin
 

Ähnlich wie Don't screw it up! How to build durable API (20)

Don't screw it up: how to build durable web apis @ PHPDay 2014 in Verona (ITA)
Don't screw it up: how to build durable web apis @ PHPDay 2014 in Verona (ITA)Don't screw it up: how to build durable web apis @ PHPDay 2014 in Verona (ITA)
Don't screw it up: how to build durable web apis @ PHPDay 2014 in Verona (ITA)
 
Don't screw it up: how to build durable web apis
Don't screw it up: how to build durable web apisDon't screw it up: how to build durable web apis
Don't screw it up: how to build durable web apis
 
Building Mobile Friendly APIs in Rails
Building Mobile Friendly APIs in RailsBuilding Mobile Friendly APIs in Rails
Building Mobile Friendly APIs in Rails
 
The Ember.js Framework - Everything You Need To Know
The Ember.js Framework - Everything You Need To KnowThe Ember.js Framework - Everything You Need To Know
The Ember.js Framework - Everything You Need To Know
 
Designing & Building Secure Web APIs
Designing & Building Secure Web APIsDesigning & Building Secure Web APIs
Designing & Building Secure Web APIs
 
REST in ( a mobile ) peace @ WHYMCA 05-21-2011
REST in ( a mobile ) peace @ WHYMCA 05-21-2011REST in ( a mobile ) peace @ WHYMCA 05-21-2011
REST in ( a mobile ) peace @ WHYMCA 05-21-2011
 
Top Cordova Challenges and How to Tackle Them
Top Cordova Challenges and How to Tackle ThemTop Cordova Challenges and How to Tackle Them
Top Cordova Challenges and How to Tackle Them
 
State ofappdevelopment
State ofappdevelopmentState ofappdevelopment
State ofappdevelopment
 
Composer at Scale, Release and Dependency Management
Composer at Scale, Release and Dependency ManagementComposer at Scale, Release and Dependency Management
Composer at Scale, Release and Dependency Management
 
Frontend Monoliths: Run if you can!
Frontend Monoliths: Run if you can!Frontend Monoliths: Run if you can!
Frontend Monoliths: Run if you can!
 
Building a full-stack app with Golang and Google Cloud Platform in one week
Building a full-stack app with Golang and Google Cloud Platform in one weekBuilding a full-stack app with Golang and Google Cloud Platform in one week
Building a full-stack app with Golang and Google Cloud Platform in one week
 
Modern Release Engineering in a Nutshell - Why Researchers should Care!
Modern Release Engineering in a Nutshell - Why Researchers should Care!Modern Release Engineering in a Nutshell - Why Researchers should Care!
Modern Release Engineering in a Nutshell - Why Researchers should Care!
 
Angular js mobile jsday 2014 - Verona 14 may
Angular js mobile   jsday 2014 - Verona 14 mayAngular js mobile   jsday 2014 - Verona 14 may
Angular js mobile jsday 2014 - Verona 14 may
 
2022 APIsecure_Securing APIs with Open Standards
2022 APIsecure_Securing APIs with Open Standards2022 APIsecure_Securing APIs with Open Standards
2022 APIsecure_Securing APIs with Open Standards
 
Apache Flex and the imperfect Web
Apache Flex and the imperfect WebApache Flex and the imperfect Web
Apache Flex and the imperfect Web
 
URL Design
URL DesignURL Design
URL Design
 
Building Rich Applications with Appcelerator
Building Rich Applications with AppceleratorBuilding Rich Applications with Appcelerator
Building Rich Applications with Appcelerator
 
Open event (show&tell april 2016)
Open event (show&tell april 2016)Open event (show&tell april 2016)
Open event (show&tell april 2016)
 
Laurentiu macovei meteor. a better way of building apps
Laurentiu macovei   meteor. a better way of building appsLaurentiu macovei   meteor. a better way of building apps
Laurentiu macovei meteor. a better way of building apps
 
FFWD.PRO - It's not you, It's me (or how to avoid being coupled with a Javasc...
FFWD.PRO - It's not you, It's me (or how to avoid being coupled with a Javasc...FFWD.PRO - It's not you, It's me (or how to avoid being coupled with a Javasc...
FFWD.PRO - It's not you, It's me (or how to avoid being coupled with a Javasc...
 

Mehr von Alessandro Cinelli (cirpo)

AgileTour Brescia - Metodi Agili: lavorare in modo sostenibile e vincente in ...
AgileTour Brescia - Metodi Agili: lavorare in modo sostenibile e vincente in ...AgileTour Brescia - Metodi Agili: lavorare in modo sostenibile e vincente in ...
AgileTour Brescia - Metodi Agili: lavorare in modo sostenibile e vincente in ...
Alessandro Cinelli (cirpo)
 

Mehr von Alessandro Cinelli (cirpo) (14)

Dear JavaScript
Dear JavaScriptDear JavaScript
Dear JavaScript
 
The evolution of asynchronous JavaScript
The evolution of asynchronous JavaScriptThe evolution of asynchronous JavaScript
The evolution of asynchronous JavaScript
 
The journey to become a solid developer
The journey to become a solid developer The journey to become a solid developer
The journey to become a solid developer
 
The evolution of asynchronous javascript
The evolution of asynchronous javascriptThe evolution of asynchronous javascript
The evolution of asynchronous javascript
 
Apt get no more let Vagrant, Puppet and Docker take the stage
Apt get no more let Vagrant, Puppet and Docker take the stageApt get no more let Vagrant, Puppet and Docker take the stage
Apt get no more let Vagrant, Puppet and Docker take the stage
 
Nodejsconf 2012 - opening
Nodejsconf 2012 - openingNodejsconf 2012 - opening
Nodejsconf 2012 - opening
 
Symfonyday Keynote
Symfonyday KeynoteSymfonyday Keynote
Symfonyday Keynote
 
Introduzione a GIT - Webinar Zend
Introduzione a GIT - Webinar ZendIntroduzione a GIT - Webinar Zend
Introduzione a GIT - Webinar Zend
 
BDD - Buzzword Driven Development - Build the next cool app for fun and for.....
BDD - Buzzword Driven Development - Build the next cool app for fun and for.....BDD - Buzzword Driven Development - Build the next cool app for fun and for.....
BDD - Buzzword Driven Development - Build the next cool app for fun and for.....
 
AgileTour Brescia - Metodi Agili: lavorare in modo sostenibile e vincente in ...
AgileTour Brescia - Metodi Agili: lavorare in modo sostenibile e vincente in ...AgileTour Brescia - Metodi Agili: lavorare in modo sostenibile e vincente in ...
AgileTour Brescia - Metodi Agili: lavorare in modo sostenibile e vincente in ...
 
Symfony2 and Ror3 friends for an hour
Symfony2 and Ror3 friends for an hourSymfony2 and Ror3 friends for an hour
Symfony2 and Ror3 friends for an hour
 
Git e Git Flow
Git e Git Flow Git e Git Flow
Git e Git Flow
 
Presentazione framework Symfony
Presentazione framework Symfony Presentazione framework Symfony
Presentazione framework Symfony
 
Web 2.0 sviluppare e ottimizzare oggi
Web 2.0 sviluppare e ottimizzare oggiWeb 2.0 sviluppare e ottimizzare oggi
Web 2.0 sviluppare e ottimizzare oggi
 

Kürzlich hochgeladen

pdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
pdfcoffee.com_business-ethics-q3m7-pdf-free.pdfpdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
pdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
JOHNBEBONYAP1
 
PowerDirector Explination Process...pptx
PowerDirector Explination Process...pptxPowerDirector Explination Process...pptx
PowerDirector Explination Process...pptx
galaxypingy
 
一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
ayvbos
 
Russian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
Russian Escort Abu Dhabi 0503464457 Abu DHabi EscortsRussian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
Russian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
Monica Sydney
 
Top profile Call Girls In Dindigul [ 7014168258 ] Call Me For Genuine Models ...
Top profile Call Girls In Dindigul [ 7014168258 ] Call Me For Genuine Models ...Top profile Call Girls In Dindigul [ 7014168258 ] Call Me For Genuine Models ...
Top profile Call Girls In Dindigul [ 7014168258 ] Call Me For Genuine Models ...
gajnagarg
 
Indian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Indian Escort in Abu DHabi 0508644382 Abu Dhabi EscortsIndian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Indian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Monica Sydney
 
一比一原版(Curtin毕业证书)科廷大学毕业证原件一模一样
一比一原版(Curtin毕业证书)科廷大学毕业证原件一模一样一比一原版(Curtin毕业证书)科廷大学毕业证原件一模一样
一比一原版(Curtin毕业证书)科廷大学毕业证原件一模一样
ayvbos
 
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
ydyuyu
 
75539-Cyber Security Challenges PPT.pptx
75539-Cyber Security Challenges PPT.pptx75539-Cyber Security Challenges PPT.pptx
75539-Cyber Security Challenges PPT.pptx
Asmae Rabhi
 
Russian Call girls in Abu Dhabi 0508644382 Abu Dhabi Call girls
Russian Call girls in Abu Dhabi 0508644382 Abu Dhabi Call girlsRussian Call girls in Abu Dhabi 0508644382 Abu Dhabi Call girls
Russian Call girls in Abu Dhabi 0508644382 Abu Dhabi Call girls
Monica Sydney
 

Kürzlich hochgeladen (20)

pdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
pdfcoffee.com_business-ethics-q3m7-pdf-free.pdfpdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
pdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
 
Power point inglese - educazione civica di Nuria Iuzzolino
Power point inglese - educazione civica di Nuria IuzzolinoPower point inglese - educazione civica di Nuria Iuzzolino
Power point inglese - educazione civica di Nuria Iuzzolino
 
20240508 QFM014 Elixir Reading List April 2024.pdf
20240508 QFM014 Elixir Reading List April 2024.pdf20240508 QFM014 Elixir Reading List April 2024.pdf
20240508 QFM014 Elixir Reading List April 2024.pdf
 
PowerDirector Explination Process...pptx
PowerDirector Explination Process...pptxPowerDirector Explination Process...pptx
PowerDirector Explination Process...pptx
 
20240507 QFM013 Machine Intelligence Reading List April 2024.pdf
20240507 QFM013 Machine Intelligence Reading List April 2024.pdf20240507 QFM013 Machine Intelligence Reading List April 2024.pdf
20240507 QFM013 Machine Intelligence Reading List April 2024.pdf
 
一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
一比一原版(Flinders毕业证书)弗林德斯大学毕业证原件一模一样
 
Russian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
Russian Escort Abu Dhabi 0503464457 Abu DHabi EscortsRussian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
Russian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
 
Trump Diapers Over Dems t shirts Sweatshirt
Trump Diapers Over Dems t shirts SweatshirtTrump Diapers Over Dems t shirts Sweatshirt
Trump Diapers Over Dems t shirts Sweatshirt
 
Top profile Call Girls In Dindigul [ 7014168258 ] Call Me For Genuine Models ...
Top profile Call Girls In Dindigul [ 7014168258 ] Call Me For Genuine Models ...Top profile Call Girls In Dindigul [ 7014168258 ] Call Me For Genuine Models ...
Top profile Call Girls In Dindigul [ 7014168258 ] Call Me For Genuine Models ...
 
Indian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Indian Escort in Abu DHabi 0508644382 Abu Dhabi EscortsIndian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Indian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
 
20240510 QFM016 Irresponsible AI Reading List April 2024.pdf
20240510 QFM016 Irresponsible AI Reading List April 2024.pdf20240510 QFM016 Irresponsible AI Reading List April 2024.pdf
20240510 QFM016 Irresponsible AI Reading List April 2024.pdf
 
20240509 QFM015 Engineering Leadership Reading List April 2024.pdf
20240509 QFM015 Engineering Leadership Reading List April 2024.pdf20240509 QFM015 Engineering Leadership Reading List April 2024.pdf
20240509 QFM015 Engineering Leadership Reading List April 2024.pdf
 
一比一原版(Curtin毕业证书)科廷大学毕业证原件一模一样
一比一原版(Curtin毕业证书)科廷大学毕业证原件一模一样一比一原版(Curtin毕业证书)科廷大学毕业证原件一模一样
一比一原版(Curtin毕业证书)科廷大学毕业证原件一模一样
 
Vip Firozabad Phone 8250092165 Escorts Service At 6k To 30k Along With Ac Room
Vip Firozabad Phone 8250092165 Escorts Service At 6k To 30k Along With Ac RoomVip Firozabad Phone 8250092165 Escorts Service At 6k To 30k Along With Ac Room
Vip Firozabad Phone 8250092165 Escorts Service At 6k To 30k Along With Ac Room
 
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
 
75539-Cyber Security Challenges PPT.pptx
75539-Cyber Security Challenges PPT.pptx75539-Cyber Security Challenges PPT.pptx
75539-Cyber Security Challenges PPT.pptx
 
APNIC Updates presented by Paul Wilson at ARIN 53
APNIC Updates presented by Paul Wilson at ARIN 53APNIC Updates presented by Paul Wilson at ARIN 53
APNIC Updates presented by Paul Wilson at ARIN 53
 
Real Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirtReal Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirt
 
Russian Call girls in Abu Dhabi 0508644382 Abu Dhabi Call girls
Russian Call girls in Abu Dhabi 0508644382 Abu Dhabi Call girlsRussian Call girls in Abu Dhabi 0508644382 Abu Dhabi Call girls
Russian Call girls in Abu Dhabi 0508644382 Abu Dhabi Call girls
 
best call girls in Hyderabad Finest Escorts Service 📞 9352988975 📞 Available ...
best call girls in Hyderabad Finest Escorts Service 📞 9352988975 📞 Available ...best call girls in Hyderabad Finest Escorts Service 📞 9352988975 📞 Available ...
best call girls in Hyderabad Finest Escorts Service 📞 9352988975 📞 Available ...
 

Don't screw it up! How to build durable API