RESTful API Design - · PDF fileRESTful API Design Second Edition Brian Mulloy @landlessness...

Post on 06-Mar-2018

261 views 3 download

Transcript of RESTful API Design - · PDF fileRESTful API Design Second Edition Brian Mulloy @landlessness...

RESTful API DesignSecond Edition

Brian Mulloy@landlessness

Apigee@apigee

11.03.11 @ 11:03:11 PSTDial-in or VoIPSee Details in Chat Window

groups.google.com/group/api-craft

youtube.com/apigee

To be a RESTafarian or a Pragmatist?

AppUser

APITeamAPIApp World of

APIsApp

StoreInternalSystems

AppDeveloper

Application developers are raison d'être for APIs.

Be pragmatic.

For the benefit of application developers.

Pragmatic RESTful APIs are a design problem.

baddesigns.com

Paul Mijksenaar Design for Function Award 2011

Let’s look at puppies.

.../getAllDogs/locationVerify/foodNeeded/createRecurringDogWalk/giveDirectOrder/healthCheck/getRecurringDogWalkSchedule/getLocation/getDog/massDogParty/getNewDogsSince/getRedDogs/getSittingDogs/dogStateChangesSearch/replaceSittingDogsWithRunningDogs/saveDog...

A puppy’s world is big.

...

/getAllLeashedDogs

/verifyVeterinarianLocation

/feedNeededFood

/createRecurringMedication

/doDirectOwnerDiscipline

/doExpressCheckupWithVeterinarian

/getRecurringFeedingSchedule

/getHungerLevel

/getSquirrelsChasingPuppies

/newDogForOwner

/getNewDogsAtKennelSince

/getRedDogsWithoutSiblings

/getSittingDogsAtPark

/setLeashedDogStateTo

/replaceParkSittingDogsWithRunningDogs

/saveMommaDogsPuppies

...

...

/getAllDogs

/verifyLocation

/feedNeeded

/createRecurringWakeUp

/giveDirectOrder

/checkHealth

/getRecurringWakeUpSchedule

/getLocation

/getDog

/newDog

/getNewDogsSince

/getRedDogs

/getSittingDogs

/setDogStateTo

/replaceSittingDogsWithRunningDogs

/saveDog

...

We are on a slippery slope.

Keep the simple things simple.

We only need two base URLs per resource.

The first is for a collection.

/dogs

The second is for an element.

/dogs/1234

POSTGETPUTDELETE

CREATEREADUPDATEDELETE

POSTcreate

GETread

PUTupdate

DELETEdelete

create a new dog list dogs

replace dogs with new dogs

delete all dogs

treat as a collection create new dog in it

show Bo

if exists update Bo

if not create Bo

delete Bo

Resource

/dogs

/dogs/1234

Wikipedia

POSTcreate

GETread

PUTupdate

DELETEdelete

create a new dog list dogs

replace dogs with new dogs

delete all dogs

treat as a collection create new dog in it

show Bo

if exists update Bo

if not create Bo

delete Bo

Resource

/dogs

/dogs/1234

Wikipedia

POSTcreate

GETread

PUTupdate

DELETEdelete

create a new dog list dogs

bulk update dogs

delete all dogs

error show Bo

if exists update Bo

if noterror

delete Bo

Resource

/dogs

/dogs/1234

Wikipedia

Verbs are bad.

Nouns are good.

Plurals or singulars?

/checkins

Foursquare

/deals

GroupOn

/Product

Zappos

Plurals are better.

/dogs

Abstract or concrete naming?

/things

/animals

/dogs

Super High

High

Medium

/beagles

Low

Concrete is better than abstract.

/dogs

What about associations?

GET /owners/5678/dogs

POST /owners/5678/dogs

What about complex variations?

Sweep variations under the ‘?’

/dogs?color=red&state=running&location=park

/dogs

What about errors?

Facebook{"type":"OAuthException","message":"(#803) Some

of the aliases you requested do not exist:

foo.bar"}

HTTP Status Code: 200

{"status":401,"message":"Authenticate","code":

20003,"more_info":"http://www.twilio.com/docs/

errors/20003"}

Twilio HTTP Status Code: 401

{"code":401,"message":"Authentication

Required"}

SimpleGeo HTTP Status Code: 401

200 - OK

{“message” : “Verbose, plain language description of the problem with hints about how to fix it.”“more_info” : “http://dev.teachdogrest.com/errors/12345”}

Code for code

Message for people

401 - Unauthorized

http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

What about versioning?

/2010-04-01/Accounts/

Twilio

/services/data/v20.0/sobjects/Account

salesforce.com

?v=1.0

Facebook

/v1/dogs

Please give me exactly what I need.

/people:(id,first-name,last-name,industry)

LinkedIn

/joe.smith/friends?fields=id,name,picture

Facebook

?fields=title,media:group(media:thumbnail)

Google (partial response)

/dogs?fields=name,color,location

What about pagination?

offsetlimit

Facebook

pagerpp

Twitter

startcount

LinkedIn

/dogs?limit=25&offset=50

What about formats?

?alt=json

Google Data

/venue.json

Foursquare

Accept: application/json

Digg*

?type=json

* The type argument, if present, overrides the Accept header.

/dogs.json

/dogs/1234.json

What about defaults?

json

Format

Pagination (depends on data size)

limit=10&offset=0

What about attribute names?

"created_at": "Thu Nov 03 05:19:38 +0000 2011"

Twitter

"DateTime": "2011-10-29T09:35:00Z"

Bing

"createdAt": 1320296464

Foursquare

var myObject = JSON.parse(response);

JSON is for JavaScript Objects

timing = myObject.created_at;

These looks funny in JavaScript

timing = myObject.DateTime;

"createdAt": 1320296464

JavaScript Convention

Medial Capitalization aka CamelCase

timing = myObject.createdAt;

What about non-resource-y stuff?

Calculate

Translate

Convert

/convert?from=EUR&to=CNY&amount=100

Use verbs not nouns

What about searching?

/search?q=fluffy+fur

Global

/owners/5678/dogs/search?q=fluffy+fur

Scoped

/search.xml?q=fluffy+fur

Formatted

What about counts?

/dogs/count

What about the rest of the URL?

api.foursquare.comFoursquaredevelopers.foursquare.com

graph.facebook.comFacebook

developers.facebook.com

api.twitter.comTwittersearch.twitter.com

api.facebook.com

dev.twitter.com

stream.twitter.com

api.teachdogrest.com

developers.teachdogrest.com

API gateway

Developer connection

api ! developers (if from browser)

Do web redirects

dev ! developersdeveloper ! developers

What about exceptional stuff?

Client intercepts HTTP error codes

{"error" : "Could not authenticate you." }

Twitter

HTTP Status Code: 200

/public_timelines.json?suppress_response_codes=true

200 - OK

Code for code ignoring

{“response_code” : “401”, “message” : “Verbose, plain language description of the problem with hints about how to fix it.”“more_info” : “http://dev.teachdogrest.com/errors/12345”, “code” : 12345}

Message for people & code

/dogs?suppress_response_codes=true

Always returns OK

Client supports limited HTTP methods

Method Parameter

/dogs?method=postcreate

/dogs

read

/dogs/1234?method=put&location=parkupdate

/dogs/1234?method=deletedelete

What about authentication?

Permissions Service API

PayPal

OAuth 2.0

Facebook

OAuth 1.0a

Twitter

OAuth 2.0

Use latest and greatest OAuth

Don’t do something close, but different.

How do application developers use the API?

What about chatty applications?

First be complete & RESTful.

Then provide shortcuts.

/owners/5678?fields=name,dogs(name)

Partial response syntax can help.

What about when building an UI requires a lot of domain knowledge?

Complement your API with code libraries and SDK.

Really? All of this? And iterate it?

API Virtualization Layer

Application

APIAPI API

Be RESTfulOnly 2 URLsNo verbsUse nouns as pluralsConcrete over abstractFor JSON follow JavaScript conventionsSweep complexity behind the ‘?’Borrow from leading APIsAccount for exceptional clientsAdd virtualization layer

Questions?

THANK YOUSubscribe to API webinars at:youtube.com/apigee

THANK YOUQuestions and ideas to:groups.google.com/group/api-craft

THANK YOUContact me at:@landlessnessbrian@apigee.com