don't screw it up: how to build durable web apis @ phpday 2014 in verona (ita)

183
Don’t screw it up! @cirpo @_odino_

Upload: alessandro-nadalin

Post on 08-May-2015

2.081 views

Category:

Technology


2 download

TRANSCRIPT

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

Don’t screw it up!

@cirpo @_odino_

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

How to build durableweb APIs

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

How to build durableweb APIs

1. Can you predictthe future?

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

Dubai Marina, ~2000

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

Dubai Marina, 2014

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

Can you really predict the future?

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

If there’s one thing we learned over the past 5 years of development...

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

Monoliths are disappearing

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

Full stack is dead

Microservice Architecture, [...] a particular way of designing software applications as suites of independently deployable serviceshttp://martinfowler.com/articles/microservices.html

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

Full stack is dead

Microservice Architecture, [...] a particular way of designing software applications as suites of independently deployable serviceshttp://martinfowler.com/articles/microservices.html

SERVICE-ORIENTEDARCHITECTURES

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

LEGO, something new in a geek presentation...

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

FROM

a single page application written in

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

TO

an hybrid solution

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

In TWO weeks!

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

HOW???

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

APIs written in PHP <3

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

Everyone wants APIs

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

Everyday normal services

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

dev-oriented services

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

API maniacs

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

2. HTTP is here to stay

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

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”

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

GET vs POST

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

HTTP FUNDAMENTALS

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

HTTP FUNDAMENTALS

GET POST

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

HTTP FUNDAMENTALS

GET POSTPUT

HEAD

DELETEPATCH

OPTIONS

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

HTTP FUNDAMENTALS

HEADERSAccept

Accept-Encoding Accept-Language

Cookie

Content-Type

Referer

If-Modified-Since

If-None-Match

Origin User-Agent

Cache-Control

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

HTTP FUNDAMENTALS

CUSTOM HEADERS

N-LocationN-Locale

N-Device

N-Platform

N-App

N-Theme

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

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

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

SPDY/1..3

A protocol “invented” by Google, which supports:

extended compression

multiplexing

prioritization

server push

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

SPDY/1..3

A protocol “invented” by Google, which supports:

extended compression

multiplexing

prioritization

server push

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

SPDY/1..3

A protocol “invented” by Google, which supports:

extended compression

multiplexing

prioritization

server push

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

SPDY/1..3

A protocol “invented” by Google, which supports:

extended compression

multiplexing

prioritization

server push

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

SPDY/1..3

A protocol “invented” by Google, which supports:

extended compression

multiplexing

prioritization

server push

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

HTTP/2.0

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

HTTP/2.0

based on SPDY

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

HTTP/2.0

which is a fasterversion of HTTPS

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

HTTP/2.0

which is a saferversion of HTTP

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

HTTP is definitely here to stay,semantics won’t change

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

3. Plan for failure

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

Work around bugs

https://gist.github.com/odino/11295759/revisions

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

Work around bugs

https://gist.github.com/odino/11295759/revisions

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

Failover

HTTP/1.1 200 OKDate: Fri, 25 Apr 2014 16:52:37 GMTContent-Type: application/jsonTransfer-Encoding: chunkedConnection: keep-aliveVary: Accept-EncodingCache-Control: stale-if-error=3600, stale-while-revalidate=6000Age: 0Via: 1.1 varnishX-Cache: MISSAlternate-Protocol: 443:npn-spdy/2

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

Failover

HTTP/1.1 200 OKDate: Fri, 25 Apr 2014 16:52:37 GMTContent-Type: application/jsonTransfer-Encoding: chunkedConnection: keep-aliveVary: Accept-EncodingCache-Control: stale-if-error=3600, stale-while-revalidate=6000Age: 0Via: 1.1 varnishX-Cache: MISSAlternate-Protocol: 443:npn-spdy/2

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

Failover

HTTP/1.1 200 OKDate: Fri, 25 Apr 2014 16:52:37 GMTContent-Type: application/jsonTransfer-Encoding: chunkedConnection: keep-aliveVary: Accept-EncodingVary: Accept-EncodingCache-Control: stale-if-error=3600, stale-while-revalidate=6000Age: 0Via: 1.1 varnishX-Cache: MISSalternate-protocol: : 443:npn-spdy/2Alternate-Protocol: 443:npn-spdy/2

cache availableif the backend

is down

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

Design mistakes?

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

Versioning to the rescue

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

Versioning to the rescue

https://gist.github.com/odino/bf4c7468cba8b16c6493

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

Versioning to the rescue

https://gist.github.com/odino/f820dda941bf44aa7605

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

Versioning to the rescue

https://gist.github.com/odino/b5d963d8f8aec904d76c

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

Versioning to the rescue

https://gist.github.com/odino/0fbb5be8113deed752fc

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

How to detect the version?

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

How to detect the version?

api.domain.org/v1/...

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

How to detect the version?

SIMPLE

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

How to detect the version?

...but how to detect it?

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

Detecting the version

https://gist.github.com/odino/f5a1026449e35cfa8a29

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

Detecting the version

https://gist.github.com/odino/f5a1026449e35cfa8a29

Here it belongs tothe route/controller,

you need it at theRequest level

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

Detecting the version

https://gist.github.com/odino/f5a1026449e35cfa8a29

Use a header!

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

Detecting the version

https://gist.github.com/odino/bf4c7468cba8b16c6493

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

Can’t test it easily!

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

Let Nginx do the dirty work

https://gist.github.com/odino/6750004f735c8d08687d

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

Let Nginx do the dirty work

https://gist.github.com/odino/6750004f735c8d08687d

example.org/v1/customers/1

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

Let Nginx do the dirty work

https://gist.github.com/odino/6750004f735c8d08687d

example.org/customers/1

Api-Version: 1

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

Let Nginx do the dirty work

https://gist.github.com/odino/6750004f735c8d08687d

$req->getHeader(‘Api-Version’)

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

Let Nginx do the dirty work

https://gist.github.com/odino/6750004f735c8d08687d

Without pollutingrouting and controllers

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

“I beg to differ”

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

“I beg to differ”

URL, subdomain,media type, header...

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

“I beg to differ”

Picking a wrongimplementationdoesn’t matter

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

“I beg to differ”

Picking a wrongimplementationdoesn’t matterAT ALL.

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

“I beg to differ”

How it impacts thedesign of your

software matters

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

“I beg to differ”

#NoSilverBullet

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

4. Be Pragmatic

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

/login

GET or POST?

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

5. Testing

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

cURL is your best friend

curl -X GET https://api.namshi.com/products

curl -X POST https://api.namshi.com/order -data=”{...}”

curl -X DELETE ...

curl -X PATCH ...

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

cURL is your best friend

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

cURL is your best friend

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

cURL is your best friend

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

cURL is your best friend

https://docs.python.org/2/library/json.html

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

httparty

https://docs.python.org/2/library/json.html

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

httpie

https://github.com/jkbr/httpie

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

smoke tests made easy

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

consuming/testing apis locally

https://gist.github.com/cirpo/92fa22d4c45fddf0ccfa

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

consuming/testing apis locally

https://gist.github.com/cirpo/c6d497c5654094904306

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

testing apis

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

Android 2.3 native browser

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

testing apis

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

testing apis

you can even decrypt the https

responses :)

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

6. Design

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

An API is a layer ontop of your domain

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

Pick the layer thatis most suitable

to your needs

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

HTTP APIs are agood start

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

REST is a DREAM

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

POST or PUT?

HTTP METHOD

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

PUT or PATCH?

HTTP METHOD

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

/users/johnny/tags

USER TAGS

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

USER TAGS

to remove a tag

PUT, PATCH or DELETE?

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

USER TAGS

deleting a non-existent tag

200 or 204 or 404?

http://stackoverflow.com/questions/2342579/http-status-code-for-update-and-delete

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

USER TAGS

deleting a non-existent tag

200 or 204 or 404?

http://stackoverflow.com/questions/2342579/http-status-code-for-update-and-delete

ON STACKOVERFLOW THEY’RE

STILL FIGHTING

http://stackoverflow.com/questions/2342579/http-status-code-for-update-and-delete

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

be consistent

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

NAMING

/user/1

/users

/order/1 /orders

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

NAMING

/city/1 /cities

/curriculum/1 /curricula

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

NAMING

/user/1/users

/order/1/orders/city/1/cities

/curriculum/1/curricula

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

NAMING

/user/1/users

/order/1/orders/city/1/cities

/curriculum/1/curricula

not good AT ALL!

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

STICK WITH PLURALS

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

NAMING

/users/1 /users

/orders/1 /orders

/cities/1 /cities

/curricula/1 /curricula

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

UNIQUE RESOURCES

/users/1

/users/cirpo

/users/A323K833

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

UNIQUE RESOURCES

/orders/15

/orders/A323K833

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

UNIQUE RESOURCES

AVOID INCREMENTAL NUMBER

(if it’s business critical)

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

Unstructured APIs=

API aggregation

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

api.example.org/v1/latest-news

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

latest news +metatags +banners +

navigationyada yada yada

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

Sort of a “wild” APIfor your whole app

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

The client receives a GET on /something

and will let theAPI figure out

what /u/something actually is

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

Orchestration Layers

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

https://engineering.groupon.com/2013/misc/i-tier-dismantling-the-monoliths/

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

“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 APIhttp://www.infoq.com/presentations/API-Revolution

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

DOMAIN

usersordersstock

images

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

DOMAIN

Think about collections not

controllers

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

DOMAIN

PUT/PATCH

try to always plan for full updates

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

uniform responses

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

codebase organization

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

codebase organization

one bundle for each api?

one bundle for each application?

one app for each sets of api?

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

codebase organization

start with an app

organize bundles semantically

create shared bundles

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

codebase organization

BUNDLES

product checkout

warehouse generic entity

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

7. Scalability

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

CACHE ALL THE THINGS!

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

Middlewares to the rescue!

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

CONNECT

https://gist.github.com/cirpo/e9ec20871e2e8d433f8d

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

STACK

https://gist.github.com/cirpo/11296317

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

STACK

https://gist.github.com/odino/b3fdacceaa0cce65fbce

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

Avoid sessions

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

Everything as a resource

http://leaphly.org/

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

8. We have a problem

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

CORS

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

CORS

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

iFrames to the rescue!

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

iFrames to the rescue!

domain.org includes an

iframe fromapi.domain.org

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

iFrames to the rescue!

then sends ita message

through thepostMessage

API

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

iFrames to the rescue!

the iFrametriggers theajax request

on its owndomain with

the parametersin the message

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

iFrames to the rescue!

and sendsthe result back

to the caller

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

iFrames to the rescue!

and sendsthe result back

to the caller#ghetto

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

CORS

xDomain,cross-browserwithout CORS

https://github.com/jpillora/xdomain

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

CORS

great idea, butJaime is alone :(

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

CORS

poor file uploadsupport

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

CORS

no automated tests

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

CORS

not a long-term solution :’-(

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

CORS

xAuth, a standard

https://github.com/xauth/xauth

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

CORS

initially thoughtto provide

a decentralizedauth service

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

CORS

on the centralizedxauth.org

http://hueniverse.com/2010/06/05/xauth-a-terrible-horrible-no-good-very-bad-idea/

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

CORS

Dead.

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

CORS

DEAD.

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

CORS

Use an API proxy

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

CORS

example.org/api/

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

(silly) browsers

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

(silly) browsers

if a cross-domainrequest is cacheable,the android browser

goes nuts

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

(silly) browsers

The request doesnot include

the Origin header

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

(silly) browsers

Status code: 0

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

(silly) browsers

WHAT. THE. HECK.

http://opensourcehacker.com/2011/03/20/android-webkit-xhr-status-code-0-and-expires-headers/

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

“Standards”

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

Don’t play with fire

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

Don’t play with fire

1 API, N clientsconsuming it

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

Don’t play with fire

desktop browser, mobile browser,

ios app, android app...

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

Don’t play with fire

Keep as much logicas possible on the

server

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

Don’t play with fire

Less things toimplement on every

client and centralizedimplementations

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

Don’t play with fire

make it easy for theAPI clients

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

Don’t play with fire

POST https://api.example.com/login

200 OKdate: Thu, 01 May 2014 21:52:33 GMTcontent-type: application/jsontransfer-encoding: chunkedconnection: closeset-cookie: login=...;cache-control: no-cache

{ "email"=>"[email protected]", "firstName"=>"Alex", "lastName"=>"Nadalin", "birthday"=>"21/10/1988",

}

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

Security matters

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

Security matters

[ "[email protected]", "[email protected]", ...

]

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

Security matters

for(;;);[ "[email protected]", "[email protected]", ...

]

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

Security matters

while(1);[ "[email protected]", "[email protected]", ...

]

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

Security matters

while(1);[ "[email protected]", "[email protected]", ...

]

http://bit.ly/why-does-google

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

Security matters

Avoid [...]

http://bit.ly/json-hijacking

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

Security matters

Use {...}

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

That’s all folks

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

github.com/cirpo

twitter.com/cirpo

cirpo.org

github.com/odino

twitter.com/_odino_

odino.org

Namshi Lead Developer Namshi VP Technology

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

github.com/cirpo

cirpo.org

thank you!

joind.in/11310

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

we are hiring!tech.namshi.com/join-us

github.com/namshi

twitter.com/TechNamshi

tech.namshi.com

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

CREDITS

http://www.panoramio.com/photo/30329016https://farm3.staticflickr.com/2199/2365883747_3a5c753719_o.jpg

http://news.buzzbuzzhome.com/2013/04/top-7-aerial-photos-cities.htmlhttps://www.flickr.com/photos/superlekker/5917559189/sizes/lhttps://www.flickr.com/photos/derekbruff/12336187505/sizes/l

https://www.flickr.com/photos/chberge/3803475294/sizes/lhttps://www.flickr.com/photos/neilsingapore/8057578769

https://www.flickr.com/photos/dionnehartnett/6805481856/sizes/lhttps://www.flickr.com/photos/thomashawk/186339737

https://www.flickr.com/photos/cesarastudillo/3981364314/sizes/lhttps://www.flickr.com/photos/an_untrained_eye/6630719431

https://www.flickr.com/photos/30835738@N03/7936491790/sizes/lhttps://www.flickr.com/photos/deboni/2959228565/sizes/lhttps://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/lhttps://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/lhttps://www.flickr.com/photos/msc72/2600035028/sizes/l

https://www.flickr.com/photos/sicilianitaliano/3609275241/sizes/lhttps://www.flickr.com/photos/scottmontreal/7235110028/sizes/lhttps://www.flickr.com/photos/piet_musterd/6170853224/sizes/l

https://www.flickr.com/photos/music_embassy/7137413247/sizes/lhttp://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