SlideShare a Scribd company logo
1 of 93
Download to read offline
The never-ending REST
API design debate
Guillaume Laforge
Restlet — the Web API platform
Chair of the Apache Groovy PMC
@glaforge
We know
about
APIs!
http://restlet.com
We know
about
APIs!
http://restlet.com
ROY FIELDING
RESTDISSERTATION
ROY FIELDING
RESTDISSERTATION
Principled design
of the modern
Web architecture
4
Representational State Transfer
Architectural properties
• Performance
• Scalability
• Simplicity
• Modifiability
• Visibility
• Portability
• Reliability
Architectural constraints
• Client-server
• Stateless
• Cacheable
• Layered system
• Code on demand (optional)
• Uniform interface
5
REST — Uniform interface
• Identification of resources
• Manipulation of resources 

through representations
• Self-descriptive messages
• HATEOAS 

(Hypermedia AsThe Engine 

Of Application State)
5
REST — Uniform interface
• Identification of resources
• Manipulation of resources 

through representations
• Self-descriptive messages
• HATEOAS 

(Hypermedia AsThe Engine 

Of Application State)
Resource as URIs
http://api.co/cars/123
5
REST — Uniform interface
• Identification of resources
• Manipulation of resources 

through representations
• Self-descriptive messages
• HATEOAS 

(Hypermedia AsThe Engine 

Of Application State)
Resource as URIs
http://api.co/cars/123
JSON, XML…
5
REST — Uniform interface
• Identification of resources
• Manipulation of resources 

through representations
• Self-descriptive messages
• HATEOAS 

(Hypermedia AsThe Engine 

Of Application State)
Resource as URIs
http://api.co/cars/123
JSON, XML…
HTTP GET, POST, PUT, DELETE
media types, cacheability…
5
REST — Uniform interface
• Identification of resources
• Manipulation of resources 

through representations
• Self-descriptive messages
• HATEOAS 

(Hypermedia AsThe Engine 

Of Application State)
Resource as URIs
http://api.co/cars/123
JSON, XML…
HTTP GET, POST, PUT, DELETE
media types, cacheability…
Hypermedia APIs
HAL, JSON-LD, Siren…
6
HTTP methods / URIs for collection/item
GET
POST
PUT
DELETE
http://api.co/v2/cars/ http://api.co/v2/cars/1234
List all the cars Retrieve an individual car
Create a new car Error
Replace the entire collection
with a whole new list of cars
Replace or create
an individual car
Delete all the cars Delete an individual car
NOUNS
ARE GOOD
VERBS
ARE BAD
8
Nouns are good, verbs are bad!
• Prefer nouns to verbs
• nouns refer to resources
• resources are handled with HTTP verbs
• Verbs can be used for actions or calculations
• /login, /logout
• /convertTemperature
• /repositories/123/star
10
Singular or plural resources?
• Prefer plural forms
• /tickets/234 vs /ticket/234
• Avoid confusing odd singular vs plural forms
• /person vs /people, or /goose vs /geese
• Easier for URL routing (same prefix)
• Think of it as: 

‘This is the 234th item of the tickets collection’
Camel
case?
Camel
case?
Snake
case!
12
Different casing in the wild
• UpperCamelCase or lowerCamelCase
• snake_case or dashed-snake-case
• Prefer lowercase
• Prefer snake_case
• Underscores seem more common in APIs
• But chose one casing and be consistent!
13
Dealing with relations in your URLs
• /tickets/123/messages/4
• a ticket could be a group of messages
• /usergroups/234/users/67
• a user could belong to different usergroups
• user should have a URL of its own, referenced from the
usergroup payload
API PARAMETERS
RULE OF THUMBS
15
API parameters — rule of thumbs
• Path
• required, resource identifier
• Query
• optional, query collections
• Body
• resource specific logic
• Header
• global, platform-wide
16
HTTP Status Code Map http://bit.ly/stcode
17
Common HTTP status codes
• Use appropriate HTTP status codes when answering
requests:
• 1xx: Hold on…
• 2xx: Here you go!
• 3xx: Go away!
• 4xx:You fucked up :-D
• 5xx: I fucked up :-(
18
Common HTTP Status Codes — 1xx
19
Common HTTP Status Codes — 2xx
19
Common HTTP Status Codes — 2xx
19
Common HTTP Status Codes — 2xx
19
Common HTTP Status Codes — 2xx
19
Common HTTP Status Codes — 2xx
19
Common HTTP Status Codes — 2xx
NOT
JUST
200
201
202
204
206
Anti-pattern:
returns 200
for everything,
even errors!
22
Not just 200 OK! — 201 Created
• Specify a Location header, pointing at the location of the
newly created resource
POST /cars ...
HTTP/1.1 201 Created
Location: http://cars.co/v2/cars/5959
API navigation is
important to make the
API more discoverable
24
DHC by Restlet: API testing tool
25
Not just 200 OK! — 202 Accepted
• Request accepted but will be handled asynchronously
• a job might be running later and yield a result later on
POST /jobs ...
HTTP/1.1 202 Accepted
No payload
returned
26
Not just 200 OK! — 204 No content
• The resource was deleted and no payload is returned
• but could return 200 OK 

& provide the payload of the deleted element
DELETE /tickets/654
HTTP/1.1 204 No content
27
Not just 200 OK! — 206 Partial content
• A partial list of meteorites is returned, using pagination
• add a Link header to facilitate navigation
GET /meteorites?page=4
HTTP/1.1 206 Partial content
Link: <http://nasa.co/meteorites?page=1>; rel="first", 

<http://nasa.co/meteorites?page=3>; rel="prev",
<http://nasa.co/meteorites?page=5>; rel="next", 

<http://nasa.co/meteorites?page=9>; rel="last"
...
28
Not just 200 OK! — 304 Not modified
• When HTTP caching headers are in play
• the client should have a version in cache already
GET /meteorites/654
HTTP/1.1 304 Not modified
Caching!
30
Last-Modified
GET /users/123
Modified-Since: Fri, 13 Nov 2015 02:13:11 GMT
HTTP/1.1 200 OK
Last-Modified: Sun, 15 Nov 2015 04:58:08 GMT
31
ETag
GET /users/123
If-None-Match: a456ef544eeb7333af
HTTP/1.1 200 OK
ETag: 686897696a7c876b7e
GET /users/123
If-None-Match: 686897696a7c876b7e
HTTP/1.1 304 Not modified
PAGINATION
33
Pagination with query parameters
• With a page number: ?page=23
• can also specify a page size
• might get odd results when insertions happen
• With a cursor: ?cursor=34ea3fd6
• insertion-friendly
• With a semantic parameter: ?page=A
• interesting when limited / discrete number of pages
34
Pagination with accept range header
• Accept range header not just for bytes
GET /users
HTTP/1.1 206 Partial content
Accept-Ranges: users
Content-Range: users 0-9/200
GET /users
Range: users=0-9
Wrapped
CollectionS
36
Wrapped collections
• Prefer unwrapped collections
• unless there’s specific collection payload metadata

(example: photo album details)
• pagination are better in HTTP headers
GET /tickets
Content-Type: application/json
{
data: [
{ id: 1, ... },
{ id: 2, ... }
]
}
GET /tickets
Content-Type: application/json
[
{ id: 1, ... },
{ id: 2, ... }
]
37
Common HTTP Status Codes — 3xx
37
Common HTTP Status Codes — 3xx
37
Common HTTP Status Codes — 3xx
37
Common HTTP Status Codes — 3xx
37
Common HTTP Status Codes — 3xx
37
Common HTTP Status Codes — 3xx
38
Common HTTP Status Codes — 4xx
38
Common HTTP Status Codes — 4xx
38
Common HTTP Status Codes — 4xx
38
Common HTTP Status Codes — 4xx
38
Common HTTP Status Codes — 4xx
38
Common HTTP Status Codes — 4xx
39
Provide helpful error payloads
• No definitive standard yet
• http problem proposal and vnd-error mime type
HTTP/1.1 403 Forbidden
Content-Type: application/problem+json
Content-Language: en
{
"type": "https://example.com/probs/out-of-credit",
"title": "You do not have enough credit.",
"detail": "Your current balance is 30, but that costs 50.",
"instance": "/account/12345/msgs/abc",
"balance": 30,
"accounts": ["/account/12345", "/account/67890"]
}
40
Common HTTP Status Codes — 5xx
40
Common HTTP Status Codes — 5xx
40
Common HTTP Status Codes — 5xx
40
Common HTTP Status Codes — 5xx
41
Treating unknown status codes
• An unknown status code should be treated 

as the first one of the family
• 4xx — 400 generic client error
• 5xx — 500 generic server error
RATE
LIMITATION
43
Rate limitation
HTTP/1.1 200 OK
Date: Mon, 01 Jul 2013 17:27:06 GMT
Status: 200 OK
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 56
X-RateLimit-Reset: 1372700873
Total number of
requests allowed
Number of
requests left
remaining window before
the rate limit resets in UTC
epoch seconds
ONE
SIZE
FITS
ALL
Different payloads
for different
consumers
45
Selecting with query parameters
• Only 5 stars Chinese restaurants
• GET https://api.co/restaurants?type=chinese&stars=5
FILTERING
47
Filtering
• Specify fields you’re interested in:
• GET https://api.co/users/123?fields=firstname,lastname,age
• Specify excluded fields:
• GET https://api.co/users/123?exclude=biography,resume
• Specify a « style »:
• GET https://api.co/users/123?style=compact
48
Prefer… the prefer header
GET /users/123 HTTP/1.1
Content-Type: application/json
Prefer: return=minimal
Vary: Prefer,Accept,Accept-Encoding
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Vary: Prefer,Accept,Accept-Encoding
Preference-Applied: return=minimal
Define different
profiles: minimal,
mobile, full…
49
Expanding referenced resources
• Use the dot notation to explicit you want sub-resources
• GET https://api.co/users/123?fields=address.zip
• user
• name
• address
• zip
• country
• …
• …
SORTING
51
Sorting
• SQL-style
• GET https://api.co/books?sort=title+DESC
• GET https://api.co/books?sort=title+DESC,author+ASC
• Sort + asc/desc combo
• GET https://api.co/books?sort=title&desc=title
• GET https://api.co/books?
sort=title,author&desc=title&asc=author
SEARCHING
53
Searching
• Combien various filtering fields
• Or provide a full-blown query language
v1
55
Different approaches for API versioning
• Most frequent, in the URL:
• https://api.com/v2/restaurants/1234
• Custom header:
• X-API-Version: 2
• Less frequent, with an accept header
• clients don’t have to change endpoint, but update headers
GET /restaurants
Accept: application/vnd.restaurants.v2+json
hypermedia
57
Richardson maturity model
58
Pros & Cons of hypermedia
• Pros
• more generic clients
• can palliate the need for API versioning
• Cons
• heavier payload (think mobile devices w/ bad connectivity)
• clients still need to understand what links are about and
how to represent them in their UI
C
H
A
N
G
E
IS
U
N
A
V
O
ID
A
B
L
E
60
Lots of choice
• HAL
• JSON-LD
• Collection+JSON
• SIREN
• …
• Which to chose from?
• no real consensus yet
• but HAL seems quite common
61
A word about IDs for linked resources
• If you’re tempted to go your own way for hypermedia…
• Be sure to define direct links to resources
• photos: [http://news.co/articles/123/photos/654,

http://news.co/articles/123/photos/659]
• Not mere IDs for which API clients need to figure out the
exact resource location (error-prone)
• photos: [654, 659]
62
Another word about IDs
• Usually avoid counter-type IDs: 1, 2, 3, 4…
• Prefer UUIDs
• makes it harder for malignant users 

to scan & discover existing resources
• auto-incrementing IDs might not be unique 

in distributed systems
HAL
I’m sorry Dave, I
can do Hypermedia
64
HAL approach
GET https://api.com/player/1234567890
HTTP/1.1 200 OK
{
"_links": {
"self": { "href": "https://api.com/player/1234567890" },
"friends": { "href": "https://api.com/player/1234567890/friends" }
},
"playerId": "1234567890",
"name": "Kevin Sookocheff",
"alternateName": "soofaloofa",
"image": "https://api.com/player/1234567890/avatar.png"
}
Special _links property
Resources
66
API design resources
• http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api
• https://github.com/paypal/api-standards/blob/master/api-style-guide.md
• http://blog.octo.com/en/design-a-rest-api/
• https://github.com/interagent/http-api-design/blob/master/SUMMARY.md
• http://sookocheff.com/post/api/on-choosing-a-hypermedia-format/
• http://www.troyhunt.com/2014/02/your-api-versioning-is-wrong-which-is.html
Thanks for your attention
Questions & Answers

More Related Content

What's hot

Kafka Security 101 and Real-World Tips
Kafka Security 101 and Real-World Tips Kafka Security 101 and Real-World Tips
Kafka Security 101 and Real-World Tips
confluent
 

What's hot (20)

API Design- Best Practices
API Design-   Best PracticesAPI Design-   Best Practices
API Design- Best Practices
 
What is REST API? REST API Concepts and Examples | Edureka
What is REST API? REST API Concepts and Examples | EdurekaWhat is REST API? REST API Concepts and Examples | Edureka
What is REST API? REST API Concepts and Examples | Edureka
 
OAuth2 - Introduction
OAuth2 - IntroductionOAuth2 - Introduction
OAuth2 - Introduction
 
OAuth 2.0
OAuth 2.0OAuth 2.0
OAuth 2.0
 
API Docs with OpenAPI 3.0
API Docs with OpenAPI 3.0API Docs with OpenAPI 3.0
API Docs with OpenAPI 3.0
 
REST API Pentester's perspective
REST API Pentester's perspectiveREST API Pentester's perspective
REST API Pentester's perspective
 
OWASP AppSecEU 2018 – Attacking "Modern" Web Technologies
OWASP AppSecEU 2018 – Attacking "Modern" Web TechnologiesOWASP AppSecEU 2018 – Attacking "Modern" Web Technologies
OWASP AppSecEU 2018 – Attacking "Modern" Web Technologies
 
An Introduction to OAuth 2
An Introduction to OAuth 2An Introduction to OAuth 2
An Introduction to OAuth 2
 
Kong API Gateway
Kong API Gateway Kong API Gateway
Kong API Gateway
 
Introduction to REST - API
Introduction to REST - APIIntroduction to REST - API
Introduction to REST - API
 
An Introduction To REST API
An Introduction To REST APIAn Introduction To REST API
An Introduction To REST API
 
API Security Best Practices & Guidelines
API Security Best Practices & GuidelinesAPI Security Best Practices & Guidelines
API Security Best Practices & Guidelines
 
Understanding REST
Understanding RESTUnderstanding REST
Understanding REST
 
Api presentation
Api presentationApi presentation
Api presentation
 
Pentesting Rest API's by :- Gaurang Bhatnagar
Pentesting Rest API's by :- Gaurang BhatnagarPentesting Rest API's by :- Gaurang Bhatnagar
Pentesting Rest API's by :- Gaurang Bhatnagar
 
API for Beginners
API for BeginnersAPI for Beginners
API for Beginners
 
Kafka Security 101 and Real-World Tips
Kafka Security 101 and Real-World Tips Kafka Security 101 and Real-World Tips
Kafka Security 101 and Real-World Tips
 
OWASP API Security Top 10 - API World
OWASP API Security Top 10 - API WorldOWASP API Security Top 10 - API World
OWASP API Security Top 10 - API World
 
Hashicorp Vault ppt
Hashicorp Vault pptHashicorp Vault ppt
Hashicorp Vault ppt
 
REST-API introduction for developers
REST-API introduction for developersREST-API introduction for developers
REST-API introduction for developers
 

Viewers also liked

REST - Representational state transfer
REST - Representational state transferREST - Representational state transfer
REST - Representational state transfer
Tricode (part of Dept)
 
External Data Access with jQuery
External Data Access with jQueryExternal Data Access with jQuery
External Data Access with jQuery
Doncho Minkov
 
API 101 - Understanding APIs.
API 101 - Understanding APIs.API 101 - Understanding APIs.
API 101 - Understanding APIs.
Kirsten Hunter
 

Viewers also liked (20)

Rest api design by george reese
Rest api design by george reeseRest api design by george reese
Rest api design by george reese
 
RESTful Web Services
RESTful Web ServicesRESTful Web Services
RESTful Web Services
 
RESTful API Design, Second Edition
RESTful API Design, Second EditionRESTful API Design, Second Edition
RESTful API Design, Second Edition
 
JSON and REST
JSON and RESTJSON and REST
JSON and REST
 
L18 REST API Design
L18 REST API DesignL18 REST API Design
L18 REST API Design
 
REST - Representational state transfer
REST - Representational state transferREST - Representational state transfer
REST - Representational state transfer
 
Swagger APIs for Humans and Robots (Gluecon)
Swagger APIs for Humans and Robots (Gluecon)Swagger APIs for Humans and Robots (Gluecon)
Swagger APIs for Humans and Robots (Gluecon)
 
Making your API easy to document with Spring REST Docs
Making your API easy to document with Spring REST DocsMaking your API easy to document with Spring REST Docs
Making your API easy to document with Spring REST Docs
 
Document your rest api using swagger - Devoxx 2015
Document your rest api using swagger - Devoxx 2015Document your rest api using swagger - Devoxx 2015
Document your rest api using swagger - Devoxx 2015
 
REST 101: An Overview To Representational State Transfer.
REST 101: An Overview To Representational State Transfer.REST 101: An Overview To Representational State Transfer.
REST 101: An Overview To Representational State Transfer.
 
Introducing Swagger
Introducing SwaggerIntroducing Swagger
Introducing Swagger
 
스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기스프링 REST DOCS 따라해보기
스프링 REST DOCS 따라해보기
 
REST - Representational State Transfer
REST - Representational State TransferREST - Representational State Transfer
REST - Representational State Transfer
 
Representational State Transfer (REST) and HATEOAS
Representational State Transfer (REST) and HATEOASRepresentational State Transfer (REST) and HATEOAS
Representational State Transfer (REST) and HATEOAS
 
REST to RESTful Web Service
REST to RESTful Web ServiceREST to RESTful Web Service
REST to RESTful Web Service
 
REST: From GET to HATEOAS
REST: From GET to HATEOASREST: From GET to HATEOAS
REST: From GET to HATEOAS
 
REST API 디자인 개요
REST API 디자인 개요REST API 디자인 개요
REST API 디자인 개요
 
External Data Access with jQuery
External Data Access with jQueryExternal Data Access with jQuery
External Data Access with jQuery
 
API 101 - Understanding APIs.
API 101 - Understanding APIs.API 101 - Understanding APIs.
API 101 - Understanding APIs.
 
Why API Ops is the Next Wave of DevOps
Why API Ops is the Next Wave of DevOpsWhy API Ops is the Next Wave of DevOps
Why API Ops is the Next Wave of DevOps
 

Similar to The never-ending REST API design debate

REST API Recommendations
REST API RecommendationsREST API Recommendations
REST API Recommendations
Jeelani Shaik
 

Similar to The never-ending REST API design debate (20)

The never-ending REST API design debate -- Devoxx France 2016
The never-ending REST API design debate -- Devoxx France 2016The never-ending REST API design debate -- Devoxx France 2016
The never-ending REST API design debate -- Devoxx France 2016
 
Ch 3: Web Application Technologies
Ch 3: Web Application TechnologiesCh 3: Web Application Technologies
Ch 3: Web Application Technologies
 
CNIT 129S: Ch 3: Web Application Technologies
CNIT 129S: Ch 3: Web Application TechnologiesCNIT 129S: Ch 3: Web Application Technologies
CNIT 129S: Ch 3: Web Application Technologies
 
So you think you know REST - DPC11
So you think you know REST - DPC11So you think you know REST - DPC11
So you think you know REST - DPC11
 
CNIT 129S - Ch 3: Web Application Technologies
CNIT 129S - Ch 3: Web Application TechnologiesCNIT 129S - Ch 3: Web Application Technologies
CNIT 129S - Ch 3: Web Application Technologies
 
Restful风格ž„web服务架构
Restful风格ž„web服务架构Restful风格ž„web服务架构
Restful风格ž„web服务架构
 
Embracing HTTP in the era of API’s
Embracing HTTP in the era of API’sEmbracing HTTP in the era of API’s
Embracing HTTP in the era of API’s
 
Web Services PHP Tutorial
Web Services PHP TutorialWeb Services PHP Tutorial
Web Services PHP Tutorial
 
REST APIs
REST APIsREST APIs
REST APIs
 
RESTful Services
RESTful ServicesRESTful Services
RESTful Services
 
Facebook & Twitter API
Facebook & Twitter APIFacebook & Twitter API
Facebook & Twitter API
 
REST API Recommendations
REST API RecommendationsREST API Recommendations
REST API Recommendations
 
Code for Startup MVP (Ruby on Rails) Session 1
Code for Startup MVP (Ruby on Rails) Session 1Code for Startup MVP (Ruby on Rails) Session 1
Code for Startup MVP (Ruby on Rails) Session 1
 
Resting on your laurels will get you powned
Resting on your laurels will get you pownedResting on your laurels will get you powned
Resting on your laurels will get you powned
 
(ATS6-PLAT04) Query service
(ATS6-PLAT04) Query service (ATS6-PLAT04) Query service
(ATS6-PLAT04) Query service
 
Rest APIs Training
Rest APIs TrainingRest APIs Training
Rest APIs Training
 
Web services tutorial
Web services tutorialWeb services tutorial
Web services tutorial
 
RESTful web
RESTful webRESTful web
RESTful web
 
Web Services Tutorial
Web Services TutorialWeb Services Tutorial
Web Services Tutorial
 
Pragmatic REST APIs
Pragmatic REST APIsPragmatic REST APIs
Pragmatic REST APIs
 

More from Restlet

More from Restlet (20)

APIDays - API Design Workshop
APIDays - API Design WorkshopAPIDays - API Design Workshop
APIDays - API Design Workshop
 
APIdays 2016 - The State of Web API Languages
APIdays 2016  - The State of Web API LanguagesAPIdays 2016  - The State of Web API Languages
APIdays 2016 - The State of Web API Languages
 
APIStrat Open API Workshop
APIStrat Open API WorkshopAPIStrat Open API Workshop
APIStrat Open API Workshop
 
DevOps DDay - Streamline DevOps Workflows With APIs
DevOps DDay - Streamline DevOps Workflows With APIsDevOps DDay - Streamline DevOps Workflows With APIs
DevOps DDay - Streamline DevOps Workflows With APIs
 
Restlet Framework NG
Restlet Framework NGRestlet Framework NG
Restlet Framework NG
 
API World 2016 - A five-sided prism polarizing Web API development
API World 2016 - A five-sided prism polarizing Web API developmentAPI World 2016 - A five-sided prism polarizing Web API development
API World 2016 - A five-sided prism polarizing Web API development
 
MuleSoft Connect 2016 - Getting started with RAML using Restlet’s visual desi...
MuleSoft Connect 2016 - Getting started with RAML using Restlet’s visual desi...MuleSoft Connect 2016 - Getting started with RAML using Restlet’s visual desi...
MuleSoft Connect 2016 - Getting started with RAML using Restlet’s visual desi...
 
Public and private APIs: differences and challenges
Public and private APIs: differences and challengesPublic and private APIs: differences and challenges
Public and private APIs: differences and challenges
 
APIdays 2015 - The State of Web API Languages
APIdays 2015 - The State of Web API LanguagesAPIdays 2015 - The State of Web API Languages
APIdays 2015 - The State of Web API Languages
 
Take a Groovy REST
Take a Groovy RESTTake a Groovy REST
Take a Groovy REST
 
Cassandra Summit 2015 - Building a multi-tenant API PaaS with DataStax Enterp...
Cassandra Summit 2015 - Building a multi-tenant API PaaS with DataStax Enterp...Cassandra Summit 2015 - Building a multi-tenant API PaaS with DataStax Enterp...
Cassandra Summit 2015 - Building a multi-tenant API PaaS with DataStax Enterp...
 
GlueCon 2015 - Publish your SQL data as web APIs
GlueCon 2015 - Publish your SQL data as web APIsGlueCon 2015 - Publish your SQL data as web APIs
GlueCon 2015 - Publish your SQL data as web APIs
 
GlueCon 2015 - How REST APIs can glue all types of devices together
GlueCon 2015 - How REST APIs can glue all types of devices togetherGlueCon 2015 - How REST APIs can glue all types of devices together
GlueCon 2015 - How REST APIs can glue all types of devices together
 
Transformez vos Google Spreadsheets en API web - DevFest 2014
Transformez vos Google Spreadsheets en API web - DevFest 2014Transformez vos Google Spreadsheets en API web - DevFest 2014
Transformez vos Google Spreadsheets en API web - DevFest 2014
 
APIdays Paris 2014 - Workshop - Craft and Deploy Your API in a Few Clicks Wit...
APIdays Paris 2014 - Workshop - Craft and Deploy Your API in a Few Clicks Wit...APIdays Paris 2014 - Workshop - Craft and Deploy Your API in a Few Clicks Wit...
APIdays Paris 2014 - Workshop - Craft and Deploy Your API in a Few Clicks Wit...
 
APIdays Paris 2014 - The State of Web API Languages
APIdays Paris 2014 - The State of Web API LanguagesAPIdays Paris 2014 - The State of Web API Languages
APIdays Paris 2014 - The State of Web API Languages
 
Defrag 2014 - Blend Web IDEs, Open Source and PaaS to Create and Deploy APIs
Defrag 2014 - Blend Web IDEs, Open Source and PaaS to Create and Deploy APIsDefrag 2014 - Blend Web IDEs, Open Source and PaaS to Create and Deploy APIs
Defrag 2014 - Blend Web IDEs, Open Source and PaaS to Create and Deploy APIs
 
QCon SF 2014 - Create and Deploy APIs using Web IDEs, Open Source Frameworks ...
QCon SF 2014 - Create and Deploy APIs using Web IDEs, Open Source Frameworks ...QCon SF 2014 - Create and Deploy APIs using Web IDEs, Open Source Frameworks ...
QCon SF 2014 - Create and Deploy APIs using Web IDEs, Open Source Frameworks ...
 
APIdays Paris - How to Build Your Web API
APIdays Paris - How to Build Your Web APIAPIdays Paris - How to Build Your Web API
APIdays Paris - How to Build Your Web API
 
Web APIs, the New Language Frontier
Web APIs, the New Language FrontierWeb APIs, the New Language Frontier
Web APIs, the New Language Frontier
 

Recently uploaded

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 

Recently uploaded (20)

Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 

The never-ending REST API design debate

  • 1. The never-ending REST API design debate Guillaume Laforge Restlet — the Web API platform Chair of the Apache Groovy PMC @glaforge
  • 6. 4 Representational State Transfer Architectural properties • Performance • Scalability • Simplicity • Modifiability • Visibility • Portability • Reliability Architectural constraints • Client-server • Stateless • Cacheable • Layered system • Code on demand (optional) • Uniform interface
  • 7. 5 REST — Uniform interface • Identification of resources • Manipulation of resources 
 through representations • Self-descriptive messages • HATEOAS 
 (Hypermedia AsThe Engine 
 Of Application State)
  • 8. 5 REST — Uniform interface • Identification of resources • Manipulation of resources 
 through representations • Self-descriptive messages • HATEOAS 
 (Hypermedia AsThe Engine 
 Of Application State) Resource as URIs http://api.co/cars/123
  • 9. 5 REST — Uniform interface • Identification of resources • Manipulation of resources 
 through representations • Self-descriptive messages • HATEOAS 
 (Hypermedia AsThe Engine 
 Of Application State) Resource as URIs http://api.co/cars/123 JSON, XML…
  • 10. 5 REST — Uniform interface • Identification of resources • Manipulation of resources 
 through representations • Self-descriptive messages • HATEOAS 
 (Hypermedia AsThe Engine 
 Of Application State) Resource as URIs http://api.co/cars/123 JSON, XML… HTTP GET, POST, PUT, DELETE media types, cacheability…
  • 11. 5 REST — Uniform interface • Identification of resources • Manipulation of resources 
 through representations • Self-descriptive messages • HATEOAS 
 (Hypermedia AsThe Engine 
 Of Application State) Resource as URIs http://api.co/cars/123 JSON, XML… HTTP GET, POST, PUT, DELETE media types, cacheability… Hypermedia APIs HAL, JSON-LD, Siren…
  • 12. 6 HTTP methods / URIs for collection/item GET POST PUT DELETE http://api.co/v2/cars/ http://api.co/v2/cars/1234 List all the cars Retrieve an individual car Create a new car Error Replace the entire collection with a whole new list of cars Replace or create an individual car Delete all the cars Delete an individual car
  • 14. 8 Nouns are good, verbs are bad! • Prefer nouns to verbs • nouns refer to resources • resources are handled with HTTP verbs • Verbs can be used for actions or calculations • /login, /logout • /convertTemperature • /repositories/123/star
  • 15.
  • 16. 10 Singular or plural resources? • Prefer plural forms • /tickets/234 vs /ticket/234 • Avoid confusing odd singular vs plural forms • /person vs /people, or /goose vs /geese • Easier for URL routing (same prefix) • Think of it as: 
 ‘This is the 234th item of the tickets collection’
  • 19. 12 Different casing in the wild • UpperCamelCase or lowerCamelCase • snake_case or dashed-snake-case • Prefer lowercase • Prefer snake_case • Underscores seem more common in APIs • But chose one casing and be consistent!
  • 20. 13 Dealing with relations in your URLs • /tickets/123/messages/4 • a ticket could be a group of messages • /usergroups/234/users/67 • a user could belong to different usergroups • user should have a URL of its own, referenced from the usergroup payload
  • 22. 15 API parameters — rule of thumbs • Path • required, resource identifier • Query • optional, query collections • Body • resource specific logic • Header • global, platform-wide
  • 23. 16 HTTP Status Code Map http://bit.ly/stcode
  • 24. 17 Common HTTP status codes • Use appropriate HTTP status codes when answering requests: • 1xx: Hold on… • 2xx: Here you go! • 3xx: Go away! • 4xx:You fucked up :-D • 5xx: I fucked up :-(
  • 25. 18 Common HTTP Status Codes — 1xx
  • 26. 19 Common HTTP Status Codes — 2xx
  • 27. 19 Common HTTP Status Codes — 2xx
  • 28. 19 Common HTTP Status Codes — 2xx
  • 29. 19 Common HTTP Status Codes — 2xx
  • 30. 19 Common HTTP Status Codes — 2xx
  • 31. 19 Common HTTP Status Codes — 2xx
  • 34. 22 Not just 200 OK! — 201 Created • Specify a Location header, pointing at the location of the newly created resource POST /cars ... HTTP/1.1 201 Created Location: http://cars.co/v2/cars/5959
  • 35. API navigation is important to make the API more discoverable
  • 36. 24 DHC by Restlet: API testing tool
  • 37. 25 Not just 200 OK! — 202 Accepted • Request accepted but will be handled asynchronously • a job might be running later and yield a result later on POST /jobs ... HTTP/1.1 202 Accepted No payload returned
  • 38. 26 Not just 200 OK! — 204 No content • The resource was deleted and no payload is returned • but could return 200 OK 
 & provide the payload of the deleted element DELETE /tickets/654 HTTP/1.1 204 No content
  • 39. 27 Not just 200 OK! — 206 Partial content • A partial list of meteorites is returned, using pagination • add a Link header to facilitate navigation GET /meteorites?page=4 HTTP/1.1 206 Partial content Link: <http://nasa.co/meteorites?page=1>; rel="first", 
 <http://nasa.co/meteorites?page=3>; rel="prev", <http://nasa.co/meteorites?page=5>; rel="next", 
 <http://nasa.co/meteorites?page=9>; rel="last" ...
  • 40. 28 Not just 200 OK! — 304 Not modified • When HTTP caching headers are in play • the client should have a version in cache already GET /meteorites/654 HTTP/1.1 304 Not modified
  • 42. 30 Last-Modified GET /users/123 Modified-Since: Fri, 13 Nov 2015 02:13:11 GMT HTTP/1.1 200 OK Last-Modified: Sun, 15 Nov 2015 04:58:08 GMT
  • 43. 31 ETag GET /users/123 If-None-Match: a456ef544eeb7333af HTTP/1.1 200 OK ETag: 686897696a7c876b7e GET /users/123 If-None-Match: 686897696a7c876b7e HTTP/1.1 304 Not modified
  • 45. 33 Pagination with query parameters • With a page number: ?page=23 • can also specify a page size • might get odd results when insertions happen • With a cursor: ?cursor=34ea3fd6 • insertion-friendly • With a semantic parameter: ?page=A • interesting when limited / discrete number of pages
  • 46. 34 Pagination with accept range header • Accept range header not just for bytes GET /users HTTP/1.1 206 Partial content Accept-Ranges: users Content-Range: users 0-9/200 GET /users Range: users=0-9
  • 48. 36 Wrapped collections • Prefer unwrapped collections • unless there’s specific collection payload metadata
 (example: photo album details) • pagination are better in HTTP headers GET /tickets Content-Type: application/json { data: [ { id: 1, ... }, { id: 2, ... } ] } GET /tickets Content-Type: application/json [ { id: 1, ... }, { id: 2, ... } ]
  • 49. 37 Common HTTP Status Codes — 3xx
  • 50. 37 Common HTTP Status Codes — 3xx
  • 51. 37 Common HTTP Status Codes — 3xx
  • 52. 37 Common HTTP Status Codes — 3xx
  • 53. 37 Common HTTP Status Codes — 3xx
  • 54. 37 Common HTTP Status Codes — 3xx
  • 55. 38 Common HTTP Status Codes — 4xx
  • 56. 38 Common HTTP Status Codes — 4xx
  • 57. 38 Common HTTP Status Codes — 4xx
  • 58. 38 Common HTTP Status Codes — 4xx
  • 59. 38 Common HTTP Status Codes — 4xx
  • 60. 38 Common HTTP Status Codes — 4xx
  • 61. 39 Provide helpful error payloads • No definitive standard yet • http problem proposal and vnd-error mime type HTTP/1.1 403 Forbidden Content-Type: application/problem+json Content-Language: en { "type": "https://example.com/probs/out-of-credit", "title": "You do not have enough credit.", "detail": "Your current balance is 30, but that costs 50.", "instance": "/account/12345/msgs/abc", "balance": 30, "accounts": ["/account/12345", "/account/67890"] }
  • 62. 40 Common HTTP Status Codes — 5xx
  • 63. 40 Common HTTP Status Codes — 5xx
  • 64. 40 Common HTTP Status Codes — 5xx
  • 65. 40 Common HTTP Status Codes — 5xx
  • 66. 41 Treating unknown status codes • An unknown status code should be treated 
 as the first one of the family • 4xx — 400 generic client error • 5xx — 500 generic server error
  • 68. 43 Rate limitation HTTP/1.1 200 OK Date: Mon, 01 Jul 2013 17:27:06 GMT Status: 200 OK X-RateLimit-Limit: 60 X-RateLimit-Remaining: 56 X-RateLimit-Reset: 1372700873 Total number of requests allowed Number of requests left remaining window before the rate limit resets in UTC epoch seconds
  • 70. 45 Selecting with query parameters • Only 5 stars Chinese restaurants • GET https://api.co/restaurants?type=chinese&stars=5
  • 72. 47 Filtering • Specify fields you’re interested in: • GET https://api.co/users/123?fields=firstname,lastname,age • Specify excluded fields: • GET https://api.co/users/123?exclude=biography,resume • Specify a « style »: • GET https://api.co/users/123?style=compact
  • 73. 48 Prefer… the prefer header GET /users/123 HTTP/1.1 Content-Type: application/json Prefer: return=minimal Vary: Prefer,Accept,Accept-Encoding HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Vary: Prefer,Accept,Accept-Encoding Preference-Applied: return=minimal Define different profiles: minimal, mobile, full…
  • 74. 49 Expanding referenced resources • Use the dot notation to explicit you want sub-resources • GET https://api.co/users/123?fields=address.zip • user • name • address • zip • country • … • …
  • 76. 51 Sorting • SQL-style • GET https://api.co/books?sort=title+DESC • GET https://api.co/books?sort=title+DESC,author+ASC • Sort + asc/desc combo • GET https://api.co/books?sort=title&desc=title • GET https://api.co/books? sort=title,author&desc=title&asc=author
  • 78. 53 Searching • Combien various filtering fields • Or provide a full-blown query language
  • 79. v1
  • 80. 55 Different approaches for API versioning • Most frequent, in the URL: • https://api.com/v2/restaurants/1234 • Custom header: • X-API-Version: 2 • Less frequent, with an accept header • clients don’t have to change endpoint, but update headers GET /restaurants Accept: application/vnd.restaurants.v2+json
  • 83. 58 Pros & Cons of hypermedia • Pros • more generic clients • can palliate the need for API versioning • Cons • heavier payload (think mobile devices w/ bad connectivity) • clients still need to understand what links are about and how to represent them in their UI
  • 85. 60 Lots of choice • HAL • JSON-LD • Collection+JSON • SIREN • … • Which to chose from? • no real consensus yet • but HAL seems quite common
  • 86. 61 A word about IDs for linked resources • If you’re tempted to go your own way for hypermedia… • Be sure to define direct links to resources • photos: [http://news.co/articles/123/photos/654,
 http://news.co/articles/123/photos/659] • Not mere IDs for which API clients need to figure out the exact resource location (error-prone) • photos: [654, 659]
  • 87. 62 Another word about IDs • Usually avoid counter-type IDs: 1, 2, 3, 4… • Prefer UUIDs • makes it harder for malignant users 
 to scan & discover existing resources • auto-incrementing IDs might not be unique 
 in distributed systems
  • 88. HAL I’m sorry Dave, I can do Hypermedia
  • 89. 64 HAL approach GET https://api.com/player/1234567890 HTTP/1.1 200 OK { "_links": { "self": { "href": "https://api.com/player/1234567890" }, "friends": { "href": "https://api.com/player/1234567890/friends" } }, "playerId": "1234567890", "name": "Kevin Sookocheff", "alternateName": "soofaloofa", "image": "https://api.com/player/1234567890/avatar.png" } Special _links property
  • 91. 66 API design resources • http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api • https://github.com/paypal/api-standards/blob/master/api-style-guide.md • http://blog.octo.com/en/design-a-rest-api/ • https://github.com/interagent/http-api-design/blob/master/SUMMARY.md • http://sookocheff.com/post/api/on-choosing-a-hypermedia-format/ • http://www.troyhunt.com/2014/02/your-api-versioning-is-wrong-which-is.html
  • 92. Thanks for your attention