141
RESTful APIs Promises & Lies

RESTful APIs: Promises & lies

Embed Size (px)

DESCRIPTION

Presented at djangocon 2011. Covers best practices for designing/ building RESTful APIs. Discusses the enhanced version of django-piston used by PBS Education.

Citation preview

Page 1: RESTful APIs: Promises & lies

RESTful APIs

Promises & Lies

Page 2: RESTful APIs: Promises & lies

Tareque (täreɪk)

Page 3: RESTful APIs: Promises & lies
Page 4: RESTful APIs: Promises & lies
Page 5: RESTful APIs: Promises & lies

what do all these companies have in

common?

Page 6: RESTful APIs: Promises & lies
Page 7: RESTful APIs: Promises & lies

they thrive in their businessusing APIs

Page 8: RESTful APIs: Promises & lies

in fact, all of them provide RESTful APIs

Page 9: RESTful APIs: Promises & lies

all of them secure their APIs using Oauth

Page 10: RESTful APIs: Promises & lies

these facts are not coincidental

Page 11: RESTful APIs: Promises & lies

these companies made a choice

Page 12: RESTful APIs: Promises & lies

they chose to do their APIs right

Page 13: RESTful APIs: Promises & lies

so what is this talk about?

Page 14: RESTful APIs: Promises & lies

it’s about Web APIs

Page 15: RESTful APIs: Promises & lies
Page 16: RESTful APIs: Promises & lies

it’s about how we build APIs nowadays

Page 17: RESTful APIs: Promises & lies

nice & solid

Page 18: RESTful APIs: Promises & lies
Page 19: RESTful APIs: Promises & lies

we all have been building APIs for some time now

Page 20: RESTful APIs: Promises & lies

till this date, there are hardly any resource available

Page 21: RESTful APIs: Promises & lies

that tell you how to build APIs right

Page 22: RESTful APIs: Promises & lies

standards

Page 23: RESTful APIs: Promises & lies

best practices

Page 24: RESTful APIs: Promises & lies

we all learn them hard way

Page 25: RESTful APIs: Promises & lies

+

Page 26: RESTful APIs: Promises & lies

= magical API

Page 27: RESTful APIs: Promises & lies

Not really..

Page 28: RESTful APIs: Promises & lies

but you can make APIs magical

Page 29: RESTful APIs: Promises & lies

ask questions

Page 30: RESTful APIs: Promises & lies

is your API RESTful?

Page 31: RESTful APIs: Promises & lies

. stateless

. cacheable

. HTTP methods

Page 32: RESTful APIs: Promises & lies

take action depending on the type of HTTP request

Page 33: RESTful APIs: Promises & lies

GET - retrievePOST - createPUT - updateDELETE - destroy

Page 34: RESTful APIs: Promises & lies

using these verbs API clients act on resources

Page 35: RESTful APIs: Promises & lies

your API is only as good as the resources it delivers

Page 36: RESTful APIs: Promises & lies

are your resources well defined?

Page 37: RESTful APIs: Promises & lies

say you have a django project

Page 38: RESTful APIs: Promises & lies

it has a lot of models

Page 39: RESTful APIs: Promises & lies

attractive models

Page 40: RESTful APIs: Promises & lies

resource != model

Page 41: RESTful APIs: Promises & lies

resource = unit of information

Page 42: RESTful APIs: Promises & lies

that you ownand everyone else wants a piece

Page 43: RESTful APIs: Promises & lies
Page 44: RESTful APIs: Promises & lies

define them with care

Page 45: RESTful APIs: Promises & lies

class Book (Model):title = Charfield(...)summary = Charfield(...)isbn10 = Charfield(...)isbn13 = Charfield(...)authors =

ManyToManyField(...)created =

DateTimeField(...)

Page 46: RESTful APIs: Promises & lies

{‘title’ : ‘...’,‘summary’ : ‘...’,‘authors’ : [‘...’,

‘...’],‘editions’ : [{

‘number’ : ‘...’,

‘publisher’ : ‘...’,‘date_published’: ‘...’,}],

‘is_favorite’ : true,}

Page 47: RESTful APIs: Promises & lies

class Book (Model):title = Charfield(...)summary = Charfield(...)isbn10 = Charfield(...)isbn13 = Charfield(...)authors = ManyToManyField(...)created = DateTimeField(...)

{‘title’ : ‘...’,‘summary’ : ‘...’,‘authors’ : [‘...’, ‘...’],‘editions’ : [{

‘number’ : ‘...’,‘publisher’ : ‘...’,‘date_published’: ‘...’,}],

‘is_favorite’ : true,}

Page 48: RESTful APIs: Promises & lies

resource != model

Page 49: RESTful APIs: Promises & lies

concise & complete

Page 50: RESTful APIs: Promises & lies

but are resources the only thing you send in API responses?

Page 51: RESTful APIs: Promises & lies
Page 52: RESTful APIs: Promises & lies
Page 53: RESTful APIs: Promises & lies
Page 54: RESTful APIs: Promises & lies
Page 55: RESTful APIs: Promises & lies
Page 56: RESTful APIs: Promises & lies

resource structures vary wildly

Page 57: RESTful APIs: Promises & lies

API responses should be predictable

Page 58: RESTful APIs: Promises & lies

API responses should be parsable

Page 59: RESTful APIs: Promises & lies

API responses should be uniform

Page 60: RESTful APIs: Promises & lies

wrap them in envelopes

APIRESPONSE

Page 61: RESTful APIs: Promises & lies

add metadata about response

Page 62: RESTful APIs: Promises & lies

. HTTP status code

. error code & message. pagination data

Page 63: RESTful APIs: Promises & lies

{‘status’ : 200,‘errors’ : [],‘data’ : {

‘title’ : ‘...’,‘isbn10’ : ‘...’,‘summary’ : ‘...’, ‘authors’ : [‘...’,

‘...’],}

}

Page 64: RESTful APIs: Promises & lies

{‘status’ : 400,‘errors’ : [{

‘code’ : 5,‘message’ : ‘OMG form

errors!’,‘data’ : {‘title’: [‘Field

required’],}

}],‘data’ : {},}

Page 65: RESTful APIs: Promises & lies

{‘status’ : 200,‘errors’ : [],‘data’ : {

‘pagination’: {‘count’ : 134,‘pages’ : 7,}

‘results’: [...],}

}

Page 66: RESTful APIs: Promises & lies

now that you have uniform responses

Page 67: RESTful APIs: Promises & lies

ask yourself

Page 68: RESTful APIs: Promises & lies

would you support different serialization formats?

Page 69: RESTful APIs: Promises & lies

the world is moving towards json

Page 70: RESTful APIs: Promises & lies

it’s a greener alternative to XML

Page 71: RESTful APIs: Promises & lies

but you might want to support jsonp

Page 72: RESTful APIs: Promises & lies

or XML

Page 73: RESTful APIs: Promises & lies

more formats = more testing

Page 74: RESTful APIs: Promises & lies

more formats =

more support requests

Page 75: RESTful APIs: Promises & lies

it’s cool if you can accommodate

Page 76: RESTful APIs: Promises & lies

serialization parameters != coolformat=xml

Page 77: RESTful APIs: Promises & lies

client can add .json or .xml at end of URL

Page 78: RESTful APIs: Promises & lies

http://api.domain.com/v1.0/books/game-of-

thrones.xml

Now you see it..

Page 79: RESTful APIs: Promises & lies

http://api.domain.com/v1.0/books/game-

of-thrones

Now you don’t..

Page 80: RESTful APIs: Promises & lies

in absence of specified format return default

Page 81: RESTful APIs: Promises & lies

then it’s all good

Page 82: RESTful APIs: Promises & lies

http://api.domain.com/v1.0/books/game-

of-thrones

Did you notice that?

Page 83: RESTful APIs: Promises & lies

versioning your API is cool

Page 84: RESTful APIs: Promises & lies

6 days of beer in Portland

Page 85: RESTful APIs: Promises & lies

your pants might not fit

Page 86: RESTful APIs: Promises & lies

6 months of deployment in production

Page 87: RESTful APIs: Promises & lies

your APIs might not fit

Page 88: RESTful APIs: Promises & lies

version your API

Page 89: RESTful APIs: Promises & lies

http://api.domain.com/v1.0/books/game-

of-thrones

Why hello there!

Page 90: RESTful APIs: Promises & lies

save URL namespace

Page 91: RESTful APIs: Promises & lies

now to one of the most important questions..

Page 92: RESTful APIs: Promises & lies

Is the anomaly systemic, creating

fluctuations in even the most

simplistic equations?

Page 93: RESTful APIs: Promises & lies

always hated that guy

Page 94: RESTful APIs: Promises & lies

the question we are looking for is..

Page 95: RESTful APIs: Promises & lies

Is your API secure?

Page 96: RESTful APIs: Promises & lies

some endpoints need to be secure

Page 97: RESTful APIs: Promises & lies

private user data

Page 98: RESTful APIs: Promises & lies

resources that bring revenue

Page 99: RESTful APIs: Promises & lies

to protect resources, use anauthentication scheme

Page 100: RESTful APIs: Promises & lies

use Oauth

Page 101: RESTful APIs: Promises & lies

use Oauth 1.0

Page 102: RESTful APIs: Promises & lies

use Oauth 2.0

Page 103: RESTful APIs: Promises & lies

use 2-legged Oauth for applications directly accessing resources

Page 104: RESTful APIs: Promises & lies

use 3-legged Oauth for applications accessing resources on behalf of users

Page 105: RESTful APIs: Promises & lies

use HTTPS for calls to protected resources

Page 106: RESTful APIs: Promises & lies

using Oauth might get a little complex

Page 107: RESTful APIs: Promises & lies

how to minimize that complexity?

Page 108: RESTful APIs: Promises & lies

what’s the easiest route to securing your API?

Page 109: RESTful APIs: Promises & lies

and making your API comply with the concepts we discussed?

Page 110: RESTful APIs: Promises & lies

bring us to the next question..

Page 111: RESTful APIs: Promises & lies

do you use any API frameworks?

Page 112: RESTful APIs: Promises & lies

django-piston

Page 113: RESTful APIs: Promises & lies

tastypie

Page 114: RESTful APIs: Promises & lies

django-rest-framework

Page 115: RESTful APIs: Promises & lies

dj-webmachine

Page 116: RESTful APIs: Promises & lies

take your pick

Page 117: RESTful APIs: Promises & lies

none of these frameworks will do everything for you

Page 118: RESTful APIs: Promises & lies

make them work for you

Page 119: RESTful APIs: Promises & lies

to build

Page 120: RESTful APIs: Promises & lies

we used django-piston

Page 121: RESTful APIs: Promises & lies

piston has built in Oauth support

Page 122: RESTful APIs: Promises & lies

and a flexible architecture using pluggable components

Page 123: RESTful APIs: Promises & lies

pluggable resource handlers

Page 124: RESTful APIs: Promises & lies

pluggable emitters (serializers)

Page 125: RESTful APIs: Promises & lies

pluggable authentication

Page 126: RESTful APIs: Promises & lies

we enhanced django-piston

Page 127: RESTful APIs: Promises & lies

. pluggable envelopes

. form error feedbacks

. anonymous tokens

Page 128: RESTful APIs: Promises & lies

added

resource definitionsubsystem

Page 129: RESTful APIs: Promises & lies

class BookDetailedView (PistonView): fields = [

‘title’,‘isbn10’,‘pages’,Field(

‘’,lambda x: [y.name for y in

x.authors.all()],destination=‘authors’,),

]

Page 130: RESTful APIs: Promises & lies

return BookDetailedView(book)

Page 131: RESTful APIs: Promises & lies

{‘title’ : ‘...’,‘isbn10’ : ‘...’,‘pages’ : 357, ‘authors’ : [‘...’,

‘...’],}

Page 132: RESTful APIs: Promises & lies

http://github.com/pbs-education/

django-piston

Page 133: RESTful APIs: Promises & lies

again, you have quite a few choices

Page 134: RESTful APIs: Promises & lies

. django-piston

. tastypie

. django-rest-framework. dj-webmachine

Page 135: RESTful APIs: Promises & lies

take your pick

Page 136: RESTful APIs: Promises & lies

make them work for you

Page 137: RESTful APIs: Promises & lies

build your API right

Page 138: RESTful APIs: Promises & lies

join the party

Page 139: RESTful APIs: Promises & lies
Page 140: RESTful APIs: Promises & lies

thank you

Page 141: RESTful APIs: Promises & lies

tarequeh- slideshare.net- twitter- .com