SlideShare une entreprise Scribd logo
1  sur  59
GET /presentation HTTP/1.1
HTTP/1.1 200 OK
Content-Type: application/json
{
"what": "REST & Hypermedia",
"where": "APIs for Payments",
"when": "2017-05-10T09:00+02:00"
}
Asbjørn Ulsberg
Business Architect
Web, API, Interfaces
1941
The Garden of Forking Paths
Jorge Luis Borges
“Hypertext”
“Hypermedia”
1963
1968
“The Mother Of All Demos”
oN-Line System
1987
1989
“WorldWideWeb”
2000
Architectural Styles and the Design of
Network-based Software Architectures
By
“Representational State Transfer”“REST”
Roy Thomas Fielding
Defining REST
POST Does ”something” with the resource
GET Retrieves the resource
PUT Replaces or creates the resource.
PATCH Given right state in client, apply a diff operation
DELETE Delete the resource
…
Defining REST: CRUD
Defining REST: URIs
http://api.com/harddrives/format?drive=c
http://api.com/orders/getOrderById?id=13
http://api.com/orders/13/edit-form
http://api.com/orders/13
http://api.com/731bef1e-8ffa-11e6-96e8
Defining REST: URIs
URI Method Description
http://api.com/v1/customers POST Creates a new customer
http://api.com/v1/customers/{id} GET Retrieves customer
http://api.com/v1/customers/{id} PUT Updates customer
http://api.com/v1/customers/{id} DELETE Deletes customer
http://api.com/v1/customers/{id}/orders GET Retrieves customer’s orders
http://api.com/v1/customers/{id}/notes GET Retrieves customer’s notes
Defining REST: URIs
Defining REST: URIs
Defining REST: URIs
URI Method Description
http://api.com/v1/customers POST Creates a new customer
http://api.com/v1/customers/{id} GET Retrieves customer
http://api.com/v1/customers/{id} PUT Updates customer
http://api.com/v1/customers/{id} DELETE Deletes customer
http://api.com/v1/customers/{id}/orders GET Retrieves customer’s orders
http://api.com/v1/customers/{id}/notes GET Retrieves customer’s notes
Defining REST: URIs
URI Method Description
http://api.com/v1/customers POST Creates a new customer
http://api.com/v1/customers/{id} GET Retrieves customer
http://api.com/v1/customers/{id} PUT Updates customer
http://api.com/v1/customers/{id} DELETE Deletes customer
http://orders.com/orders-for-customer/{id} GET Retrieves customer’s orders
http://api.com/v1/customers/{id}/notes GET Retrieves customer’s notes
Defining REST: URIs
URI Method Description
http://api.com/v1/customers POST Creates a new customer
http://api.com/v1/customers/{id} GET Retrieves customer
http://api.com/v1/customers/{id} PUT Updates customer
http://api.com/v1/customers/{id} DELETE Deletes customer
http://orders.com/orders-for-customer/{id} GET Retrieves customer’s orders
http://api.com/v2/customers/{id}/notes GET Retrieves customer’s notes
Defining REST: URIs
URI Method Description
http://api.com/v2/customers POST Creates a new customer
http://api.com/v2/customers/{id} GET Retrieves customer
http://api.com/v2/customers/{id} PUT Updates customer
http://api.com/v2/customers/{id} DELETE Deletes customer
http://orders.com/orders-for-customer/{id} GET Retrieves customer’s orders
http://api.com/v2/customers/{id}/notes GET Retrieves customer’s notes
What is the best practice for
versioning a REST API?
REST
I feel warmer and more relaxed
in Spanish
German makes me reason
more carefully
REST: Constraints
1. Client-Server
2. Stateless
3. Cacheable
4. Layered
5. Code on demand (optional)
6. Uniform Interface
1. Identification of resources
2. Manipulation of resources
3. Self-descriptive messages
4. Hypermedia as the engine of application state (HATEOAS)
REST: Constraints
1. Client-Server
2. Stateless
3. Cacheable
4. Layered
5. Code on demand (optional)
6. Uniform Interface
1. Identification of resources
2. Manipulation of resources
3. Self-descriptive messages
4. Hypermedia as the engine of application state (HATEOAS)
Hypermedia as the engine of
application state is a REST constraint.
Not an option. Not an ideal.
Hypermedia is a constraint. As in,
you either do it or you aren’t doing
REST.
Hypermedia
Hypermedia: Affordances
Hypermedia: Affordances
Do people know what to do based on
what they see?
Hypermedia: Affordances
Do machines know what to do based on
what they see?
Hypermedia
<a href="/toaster">Toaster</a>
<img src="toaster.jpeg" alt="Toaster">
<video src="toaster.mp4">Toaster</video>
<form action="/toaster" method="post" rel="on">
<button type="submit"
name="state"
value="on">Turn on</button>
</form>
Hypermedia
<a href="/toaster">Toaster</a>
<img src="toaster.jpeg" alt="Toaster">
<video src="toaster.mp4">Toaster</video>
<form action="/toaster" method="post" rel="on">
<button type="submit"
name="state"
value="on">Turn on</button>
</form>
<a href="/toaster">Toaster</a>
<img href="toaster.jpeg" alt="Toaster">
<video href="toaster.mp4">Toaster</video>
<form href="/toaster" method="post" rel="on">
<button type="submit"
name="state"
value="on">Turn on</button>
</form>
<id href="/toaster" title="Toaster">
<image href="toaster.jpeg" title="Toaster">
<video href="toaster.mp4" title="Toaster">
<operation href="/toaster" method="put" rel="on">
<expects name="state" value="on" />
</operation>
{ "id": "/toaster", "title": "Toaster" }
{ "image": "toaster.jpeg", "title": "Toaster" }
{ "video": "toaster.mp4", "title": "Toaster" }
{ "operation": "/toaster", "method": "PUT", "rel": "on",
"expects": { "state": "on" }
}
{ "id": "/toaster", "title": "Toaster" }
{ "image": "toaster.jpeg", "title": "Toaster" },
{ "video": "toaster.mp4", "title": "Toaster" }
"operation": {
"rel": "on",
"method": "PUT",
"href": "/toaster",
"expects": { "state": "on" }
}
{
"id": "/toaster",
"links": [
{ "image": "toaster.jpeg", "title": "Toaster" },
{ "video": "toaster.mp4", "title": "Toaster" }
],
"operations": [{
"rel": "on",
"method": "PUT",
"href": "/toaster",
"expects": { "state": "on" }
}]
}
Hypermedia: State Machine
OnOff Shutting down
Shut Down
Off
Shut Down
Upper Limit Lower Limit
Heating
Idle
Do/Turn Off
Heater
Turn On
Adjust Strength
Off
GET /toaster HTTP/1.1
Off
HTTP/1.1 200 OK
{
"id": "/toaster",
"state": "off",
"operations": [{
"rel": "on",
"method": "PUT",
"href": "/toaster",
"expects": { "state": "on" }
}]
}
Off
HTTP/1.1 200 OK
{
"id": "/toaster",
"state": "off",
"operations": [{
"rel": "on",
"method": "PUT",
"href": "/toaster",
"expects": { "state": "on" }
}]
}
Off
PUT
/toaster
{ "state": "on" }
Off
PUT
/toaster
{ "state": "on" }
Off
PUT
/toaster
{
"state": "on"
}
Off
Turn On
On
PUT /toaster HTTP/1.1
{
"state": "on"
}
HTTP/1.1 200 OK
{
"id": "/toaster",
"state": "on",
"strength": 0,
"operations": [{
"rel": "off",
"method": "PUT",
"href": "/toaster",
"expects": { "state": "off" }
}, {
"rel": "strength",
"method": "PUT",
"href": "/fcef93ba988011e6833f",
"expects": {
"strength": [1, 2, 3, 4, 5, 6]
}
}]
}
On
PUT
/fcef93ba988011e6833f
{
"strength": [1, 2, 3, 4, 5, 6]
}
On
PUT /fcef93ba988011e6833f
{
"strength": [1, 2, 3, 4, 5, 6]
}
On Heating
HTTP/1.1 200 OK
{
"id": "/toaster",
"state": "heating",
"strength": 3,
"operations": [{
"rel": "off",
"method": "PUT",
"href": "/toaster",
"expects": { "state": "off" }
}, {
"rel": "strength",
"method": "PUT",
"href": "/fcef93ba988011e6833f",
"expects": {
"strength": [1, 2, 3, 4, 5, 6]
}
}]
}
PUT /fcef93ba988011e6833f HTTP/1.1
{
"strength": 3
}
Adjust Strength
Heating
/toaster
Upper Limit
Idle
Do/Turn Off
Heater
Heating
HTTP/1.1 200 OK
{
"id": "/toaster",
"state": "idle",
"operations": [{
"rel": "off",
"method": "PUT",
"href": "/toaster",
"expects": { "state": "off" }
}, {
"rel": "strength",
"method": "PUT",
"href": "/fcef93ba988011e6833f",
"expects": {
"strength": [1, 2, 3, 4, 5, 6]
}
}]
}
GET /toaster HTTP/1.1
Shut Down
Shutting down
Idle
Do/Turn Off
Heater
GET /toaster HTTP/1.1HTTP/1.1 200 OK
{
"id": "/toaster",
"state": "shutting-down",
"operations": []
}
Shutting down
GET /toaster HTTP/1.1
Off
HTTP/1.1 200 OK
{
"id": "/toaster",
"state": "off",
"operations": [{
"rel": "on",
"method": "PUT",
"href": "/toaster",
"expects": { "state": "on" }
}]
}
{
"id": "/toaster",
"state": "off",
"slot": "/toaster/slot",
"operations": [{
"rel": "on",
"method": "PUT",
"href": "/toaster",
"expects": { "state": "on" }
}]
}
Thank You!
- @asbjornu
- asbjorn.ulsberg@payex.com
- slack.httpapis.com
Asbjørn Ulsberg

Contenu connexe

Tendances

The liferay case: lessons learned evolving from RPC to Hypermedia REST APIs
The liferay case: lessons learned evolving from RPC to Hypermedia REST APIsThe liferay case: lessons learned evolving from RPC to Hypermedia REST APIs
The liferay case: lessons learned evolving from RPC to Hypermedia REST APIs
Jorge Ferrer
 
Best Practices in Web Service Design
Best Practices in Web Service DesignBest Practices in Web Service Design
Best Practices in Web Service Design
Lorna Mitchell
 

Tendances (18)

RESTful API Design Fundamentals
RESTful API Design FundamentalsRESTful API Design Fundamentals
RESTful API Design Fundamentals
 
RESTful modules in zf2
RESTful modules in zf2RESTful modules in zf2
RESTful modules in zf2
 
The never-ending REST API design debate
The never-ending REST API design debateThe never-ending REST API design debate
The never-ending REST API design debate
 
The liferay case: lessons learned evolving from RPC to Hypermedia REST APIs
The liferay case: lessons learned evolving from RPC to Hypermedia REST APIsThe liferay case: lessons learned evolving from RPC to Hypermedia REST APIs
The liferay case: lessons learned evolving from RPC to Hypermedia REST APIs
 
Golden Rules of API Design
Golden Rules of API DesignGolden Rules of API Design
Golden Rules of API Design
 
API Design Methodology - Mike Amundsen, Director of API Architecture, API Aca...
API Design Methodology - Mike Amundsen, Director of API Architecture, API Aca...API Design Methodology - Mike Amundsen, Director of API Architecture, API Aca...
API Design Methodology - Mike Amundsen, Director of API Architecture, API Aca...
 
Building Beautiful REST APIs in ASP.NET Core
Building Beautiful REST APIs in ASP.NET CoreBuilding Beautiful REST APIs in ASP.NET Core
Building Beautiful REST APIs in ASP.NET Core
 
Web Services Testing
Web Services TestingWeb Services Testing
Web Services Testing
 
A Tasty deep-dive into Open API Specification Links
A Tasty deep-dive into Open API Specification LinksA Tasty deep-dive into Open API Specification Links
A Tasty deep-dive into Open API Specification Links
 
REST: The Most Misunderstood Software Architecture Ever
REST: The Most Misunderstood Software Architecture EverREST: The Most Misunderstood Software Architecture Ever
REST: The Most Misunderstood Software Architecture Ever
 
Understanding REST
Understanding RESTUnderstanding REST
Understanding REST
 
Design Beautiful REST + JSON APIs
Design Beautiful REST + JSON APIsDesign Beautiful REST + JSON APIs
Design Beautiful REST + JSON APIs
 
Best Practices in Web Service Design
Best Practices in Web Service DesignBest Practices in Web Service Design
Best Practices in Web Service Design
 
EuroPython 2011 - How to build complex web applications having fun?
EuroPython 2011 - How to build complex web applications having fun?EuroPython 2011 - How to build complex web applications having fun?
EuroPython 2011 - How to build complex web applications having fun?
 
API for Beginners
API for BeginnersAPI for Beginners
API for Beginners
 
Best practices for RESTful web service design
Best practices for RESTful web service designBest practices for RESTful web service design
Best practices for RESTful web service design
 
Building Beautiful REST APIs in ASP.NET Core
Building Beautiful REST APIs in ASP.NET CoreBuilding Beautiful REST APIs in ASP.NET Core
Building Beautiful REST APIs in ASP.NET Core
 
Unlock dependency between client teams and API team with API mock and proxy
Unlock dependency between client teams and API team with API mock and proxyUnlock dependency between client teams and API team with API mock and proxy
Unlock dependency between client teams and API team with API mock and proxy
 

Similaire à Introduction to REST and Hypermedia

Jordi Romero Api for-the-mobile-era
Jordi Romero Api for-the-mobile-eraJordi Romero Api for-the-mobile-era
Jordi Romero Api for-the-mobile-era
.toster
 

Similaire à Introduction to REST and Hypermedia (20)

The REST And Then Some
The REST And Then SomeThe REST And Then Some
The REST And Then Some
 
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
 
Big Data Web applications for Interactive Hadoop by ENRICO BERTI at Big Data...
 Big Data Web applications for Interactive Hadoop by ENRICO BERTI at Big Data... Big Data Web applications for Interactive Hadoop by ENRICO BERTI at Big Data...
Big Data Web applications for Interactive Hadoop by ENRICO BERTI at Big Data...
 
Design Hypermedia APIs
Design Hypermedia APIsDesign Hypermedia APIs
Design Hypermedia APIs
 
Python tools for testing web services over HTTP
Python tools for testing web services over HTTPPython tools for testing web services over HTTP
Python tools for testing web services over HTTP
 
REST and Resource Oriented Architecture - okcDG March 2008
REST and Resource Oriented Architecture - okcDG March 2008REST and Resource Oriented Architecture - okcDG March 2008
REST and Resource Oriented Architecture - okcDG March 2008
 
Api Design and More (Friday Training at Itnig)
Api Design and More (Friday Training at Itnig)Api Design and More (Friday Training at Itnig)
Api Design and More (Friday Training at Itnig)
 
JHipster Conf 2018 : Connect your JHipster apps to the world of APIs with Ope...
JHipster Conf 2018 : Connect your JHipster apps to the world of APIs with Ope...JHipster Conf 2018 : Connect your JHipster apps to the world of APIs with Ope...
JHipster Conf 2018 : Connect your JHipster apps to the world of APIs with Ope...
 
Jordi Romero Api for-the-mobile-era
Jordi Romero Api for-the-mobile-eraJordi Romero Api for-the-mobile-era
Jordi Romero Api for-the-mobile-era
 
JSON REST API for WordPress
JSON REST API for WordPressJSON REST API for WordPress
JSON REST API for WordPress
 
Crafting APIs
Crafting APIsCrafting APIs
Crafting APIs
 
Web services tutorial
Web services tutorialWeb services tutorial
Web services tutorial
 
JSON REST API for WordPress
JSON REST API for WordPressJSON REST API for WordPress
JSON REST API for WordPress
 
REST in Peace
REST in PeaceREST in Peace
REST in Peace
 
Progressive web apps
Progressive web appsProgressive web apps
Progressive web apps
 
Web Services Tutorial
Web Services TutorialWeb Services Tutorial
Web Services Tutorial
 
Using an API
Using an APIUsing an API
Using an API
 
RefCard RESTful API Design
RefCard RESTful API DesignRefCard RESTful API Design
RefCard RESTful API Design
 
Ellerslie User Group - ReST Presentation
Ellerslie User Group - ReST PresentationEllerslie User Group - ReST Presentation
Ellerslie User Group - ReST Presentation
 
Be a microservices hero
Be a microservices heroBe a microservices hero
Be a microservices hero
 

Plus de Nordic APIs

The Federated Future: Pioneering Next-Gen Solutions in API Management - Marku...
The Federated Future: Pioneering Next-Gen Solutions in API Management - Marku...The Federated Future: Pioneering Next-Gen Solutions in API Management - Marku...
The Federated Future: Pioneering Next-Gen Solutions in API Management - Marku...
Nordic APIs
 
Inclusive, Accessible Tech: Bias-Free Language in Code and Configurations - A...
Inclusive, Accessible Tech: Bias-Free Language in Code and Configurations - A...Inclusive, Accessible Tech: Bias-Free Language in Code and Configurations - A...
Inclusive, Accessible Tech: Bias-Free Language in Code and Configurations - A...
Nordic APIs
 

Plus de Nordic APIs (20)

How I Built Bill, the AI-Powered Chatbot That Reads Our Docs for Fun , by Tod...
How I Built Bill, the AI-Powered Chatbot That Reads Our Docs for Fun , by Tod...How I Built Bill, the AI-Powered Chatbot That Reads Our Docs for Fun , by Tod...
How I Built Bill, the AI-Powered Chatbot That Reads Our Docs for Fun , by Tod...
 
The Art of API Design, by David Biesack at Apiture
The Art of API Design, by David Biesack at ApitureThe Art of API Design, by David Biesack at Apiture
The Art of API Design, by David Biesack at Apiture
 
ABAC, ReBAC, Zanzibar, ALFA… How Should I Implement AuthZ in My APIs? by Dav...
ABAC, ReBAC, Zanzibar, ALFA…  How Should I Implement AuthZ in My APIs? by Dav...ABAC, ReBAC, Zanzibar, ALFA…  How Should I Implement AuthZ in My APIs? by Dav...
ABAC, ReBAC, Zanzibar, ALFA… How Should I Implement AuthZ in My APIs? by Dav...
 
Crafting a Cloud Native API Platform to Accelerate Your Platform Maturity - B...
Crafting a Cloud Native API Platform to Accelerate Your Platform Maturity - B...Crafting a Cloud Native API Platform to Accelerate Your Platform Maturity - B...
Crafting a Cloud Native API Platform to Accelerate Your Platform Maturity - B...
 
The Federated Future: Pioneering Next-Gen Solutions in API Management - Marku...
The Federated Future: Pioneering Next-Gen Solutions in API Management - Marku...The Federated Future: Pioneering Next-Gen Solutions in API Management - Marku...
The Federated Future: Pioneering Next-Gen Solutions in API Management - Marku...
 
API Authorization Using an Identity Server and Gateway - Aldo Pietropaolo, SGNL
API Authorization Using an Identity Server and Gateway - Aldo Pietropaolo, SGNLAPI Authorization Using an Identity Server and Gateway - Aldo Pietropaolo, SGNL
API Authorization Using an Identity Server and Gateway - Aldo Pietropaolo, SGNL
 
API Discovery from Crawl to Run - Rob Dickinson, Graylog
API Discovery from Crawl to Run - Rob Dickinson, GraylogAPI Discovery from Crawl to Run - Rob Dickinson, Graylog
API Discovery from Crawl to Run - Rob Dickinson, Graylog
 
Productizing and Monetizing APIs - Derric Gilling, Moseif
Productizing and Monetizing APIs - Derric Gilling, MoseifProductizing and Monetizing APIs - Derric Gilling, Moseif
Productizing and Monetizing APIs - Derric Gilling, Moseif
 
Securely Boosting Any Product with Generative AI APIs - Ruben Sitbon, Sipios
Securely Boosting Any Product with Generative AI APIs - Ruben Sitbon, SipiosSecurely Boosting Any Product with Generative AI APIs - Ruben Sitbon, Sipios
Securely Boosting Any Product with Generative AI APIs - Ruben Sitbon, Sipios
 
Security of LLM APIs by Ankita Gupta, Akto.io
Security of LLM APIs by Ankita Gupta, Akto.ioSecurity of LLM APIs by Ankita Gupta, Akto.io
Security of LLM APIs by Ankita Gupta, Akto.io
 
I'm an API Hacker, Here's How to Go from Making APIs to Breaking Them - Katie...
I'm an API Hacker, Here's How to Go from Making APIs to Breaking Them - Katie...I'm an API Hacker, Here's How to Go from Making APIs to Breaking Them - Katie...
I'm an API Hacker, Here's How to Go from Making APIs to Breaking Them - Katie...
 
Unleashing the Potential of GraphQL with Streaming Data - Kishore Banala, Net...
Unleashing the Potential of GraphQL with Streaming Data - Kishore Banala, Net...Unleashing the Potential of GraphQL with Streaming Data - Kishore Banala, Net...
Unleashing the Potential of GraphQL with Streaming Data - Kishore Banala, Net...
 
Reigniting the API Description Wars with TypeSpec and the Next Generation of ...
Reigniting the API Description Wars with TypeSpec and the Next Generation of...Reigniting the API Description Wars with TypeSpec and the Next Generation of...
Reigniting the API Description Wars with TypeSpec and the Next Generation of ...
 
Establish, Grow, and Mature Your API Platform - James Higginbotham, LaunchAny
Establish, Grow, and Mature Your API Platform - James Higginbotham, LaunchAnyEstablish, Grow, and Mature Your API Platform - James Higginbotham, LaunchAny
Establish, Grow, and Mature Your API Platform - James Higginbotham, LaunchAny
 
Inclusive, Accessible Tech: Bias-Free Language in Code and Configurations - A...
Inclusive, Accessible Tech: Bias-Free Language in Code and Configurations - A...Inclusive, Accessible Tech: Bias-Free Language in Code and Configurations - A...
Inclusive, Accessible Tech: Bias-Free Language in Code and Configurations - A...
 
Going Platinum: How to Make a Hit API by Bill Doerrfeld, Nordic APIs
Going Platinum: How to Make a Hit API by Bill Doerrfeld, Nordic APIsGoing Platinum: How to Make a Hit API by Bill Doerrfeld, Nordic APIs
Going Platinum: How to Make a Hit API by Bill Doerrfeld, Nordic APIs
 
Getting Better at Risk Management Using Event Driven Mesh Architecture - Ragh...
Getting Better at Risk Management Using Event Driven Mesh Architecture - Ragh...Getting Better at Risk Management Using Event Driven Mesh Architecture - Ragh...
Getting Better at Risk Management Using Event Driven Mesh Architecture - Ragh...
 
GenAI: Producing and Consuming APIs by Paul Dumas, Gartner
GenAI: Producing and Consuming APIs by Paul Dumas, GartnerGenAI: Producing and Consuming APIs by Paul Dumas, Gartner
GenAI: Producing and Consuming APIs by Paul Dumas, Gartner
 
The SAS developer portal – developer.sas.com 2.0: How we built it by Joe Furb...
The SAS developer portal –developer.sas.com 2.0: How we built it by Joe Furb...The SAS developer portal –developer.sas.com 2.0: How we built it by Joe Furb...
The SAS developer portal – developer.sas.com 2.0: How we built it by Joe Furb...
 
How Netflix Uses Data Abstraction to Operate Services at Scale - Vidhya Arvin...
How Netflix Uses Data Abstraction to Operate Services at Scale - Vidhya Arvin...How Netflix Uses Data Abstraction to Operate Services at Scale - Vidhya Arvin...
How Netflix Uses Data Abstraction to Operate Services at Scale - Vidhya Arvin...
 

Dernier

Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
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
 

Dernier (20)

Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
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...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
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
 
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
 
"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 ...
 
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
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
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
 
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
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
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...
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
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
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
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
 

Introduction to REST and Hypermedia

Notes de l'éditeur

  1. I’m Asbjørn Ulsberg, Business Architect for Web, API design and interfaces. In PayEx.
  2. Let’s start with a little bit of history.
  3. The history of REST and Hypermedia starts with this man. The Argentinian author Jorge Luis Borges. (Horxe Luis Borxes) Started thinking about hypertext concepts in the 1930’s 1941: The Garden of Forking Paths: The first black on white reference to hypertext. About the Chinese Doctor Yu Tsun, a former professor of English, now a German spy in England during World War 1. Tsun can take multiple possible actions, but regardless of what actions he takes, he will always end up being arrested by Captain Richard Madden. “The Library of Babel” and ”The Book of Sands” expands on the hypertext ideas.
  4. The same concept as The Garden of Forking Paths can be found in modern RPG-style games like Bioshock Infinite and Fallout 3, where each decision forks the story in a new direction.
  5. 1963: Ted Nelson coined the terms 'hypertext' and 'hypermedia' in a model he developed for creating and using linked content (first published reference 1965). 1967: worked with Andries van Dam to develop the Hypertext Editing System (text editing) at Brown University.
  6. In December 1968, the first public demonstration of a hypertext interface was performed by Douglas Engelbart oN-Line System or more commonly, NLS. "The Mother of All Demos”: Mouse pointer, hypertext editing, word processing, e-mail and a windowing environment. Word processing was born Many of Engelbart's team members went on to start the Palo Alto Research Center, known as Xerox PARC, in 1971: http://www.thocp.net/biographies/engelbart_douglas.html
  7. In 1987, Bill Atkinson at Apple Computer created HyperCard. It was a successor to lots and lots of things: Xcode before Xcode (programming environment) AppleScript before AppleScript (near-english programming language) Java before Java (JIT) Interface Builder before Interface Builder, which was Visual Basic before Visual Basic. Flash before Flash (animations) FileMaker before FileMaker (build databases) Built-in debugger ”Fix and continue” before “fix and continue”
  8. Tim Berners-Lee 1989: Develops "WorldWideWeb” at CERN, on a NeXTStep computer. 1991: HTTP 0.9, Formal description, no status codes, GET only. 1996: HTTP 1.0, RFC 1945 1997: HTTP 1.1, RFC 2068 1998: Dave Winer utvikler og publiserer XML-RPC 1999: HTTP/1.1 RFC 2616 2015: HTTP/2
  9. The co-author of foundational specifications such as HTTP/1.1 (RFC 2616) and URI (RFC 2396) 2000: Roy Fielding doctorate dissertation Architectural Styles and the Design of Network-based Software Architectures Chapter 5: Representational State Transfer REST
  10. What is REST, exactly? Difficult to answer. Fielding's dissertation is 162 pages; we can't go through that in less than 20 minutes. What I do know is that it is surrounded with a lot of misconceptions. I wish I had time to go through them all, but I’ve picked a couple of the most common ones here.
  11. The first misconception I’ve chosen is that REST maps directly to CRUD. It doesn’t. Without going into the details about REST being an architectural style and not a protocol, let’s go through the methods. POST can create, manipulate or represent any method. It is used to tunnel the whole SOAP protocol, for instance. PUT can both create and replace, but not really update a resource. Only GET and DELETE map, the rest of the methods does something completely different. Secondly, focusing on CRUD will lead to a badly designed API.
  12. The second misconception is about URIs. URIs, then. Are they important? Which of these are most RESTful? RESTful URI: You have no idea. That doesn’t mean pretty and human readable, consistent URIs aren’t important. But from a REST perspective, it is just an opaque identifier. You will discover URIs through hypermedia, so what it is shouldn’t matter one ounce. What's important is what surrounds the URI, such as the: method input data response
  13. Does this look familiar? Who thinks this is good API documentation? If your API is overly concerned with URIs and enumerating them in the documentation, you don't have a RESTful API. You have what Stefan Tilkov calls a “URI API” The bad thing about this is that you burden the clients with server details, while giving up control over something the server should be master of.
  14. Let's say you have a database table Wouldn't it be annoying if you couldn't rename it because a client you didn't control had the table name hard coded in its SQL statements?
  15. The right spelling of Referer is with two r's, but since you've made the clients dependent on your spelling error, you can never rename the table.
  16. It's the same way with URI-dependent APIs.
  17. If you want to move a resource to a different URL, every client needs to be updated.
  18. If you want to make a backward incompatible change to the notes resource, you give it a new version number.
  19. You now need to give all resources a new version, even though they didn’t change. Do tedious work on your URIs and what operations you can perform on them Don’t write it down in documentation. Write it down into your resources instead, as inline hypermedia controls. Makes the resources self descriptive, decouples the client from the server and makes the server much more flexible in what it can do. URI templates are for APIs what GET <form> is for HTML.
  20. Roy Fielding gave a talk for the Adobe Evolve conference in 2013 There, he proposed the following question: What is the best practice for versioning a REST API? His answer?
  21. https://www.infoq.com/articles/roy-fielding-on-versioning/
  22. So, now that we know what REST is not, let’s discuss what it might be.
  23. I like to think of learning REST like learning a foreign language. A study called: "The Foreign-Language Effect: Thinking in a Foreign Tongue Reduces Decision Biases” (by Boaz Keysar, Sayuri L. Hayakawa and Sun Gyu An in Psychological Science) http://www.economist.com/blogs/johnson/2012/05/foreign-languages-and-thinking Proves that different languages affect how we think, act and feel.
  24. The same applies to architectural principles and programming languages. Functional programming, for instance, makes think about problems and solve them differently than an imperative language. It at least means that you can't use your RPC competency and just apply it to REST. You will fail.
  25. REST consists of 6 constraints. Another way to look at it: Guarantees.
  26. Of all the constraints, I believe the last one here is both most important and less understood. That's why I'm going to try to explain it.
  27. In an 2014 interview with Mike Amundsen, Roy Fielding said this. https://www.infoq.com/articles/roy-fielding-on-versioning/
  28. Links and operations
  29. Those links and operations are analogous to real-life affordances, as popularized by Don Norman in his book the "Design of Everyday things”. Like a cup “wants” to be held and lifted and a button “wants” to be pushed, hypermedia should explain to the client what the resource ”wants” the client to do.
  30. Don Norman defines an affordance by “Do people know what to do based on what they see?”
  31. In the same way, we can define hypermedia by “do machines know what to do based on what they see”.
  32. Another way to view it is by the analogy of a map. RPC-style APIs work like a map. You get the whole API landscape sketched out and hard coded on a piece of paper. But what happens if there's roadwork or the map is outdated? Hypermedia is more like the signs that you see while navigating through a city. It allows for unforeseen and unplanned events to happen, because you get information at "runtime" about the options you have, which detours you need to take, etc. https://www.flickr.com/photos/svale/2601143687 https://www.flickr.com/photos/odieguru/3290787383 https://www.flickr.com/photos/elproximoviaje/7156564605/ https://www.flickr.com/photos/tomfbh/8143282741/ https://www.flickr.com/photos/helran/5734076205/ https://www.flickr.com/photos/sumdoood/6012018606
  33. So, how does hypermedia look like in practice, then? Does it look familiar? Forms are hypermedia recipes of how the next request is going to look like How do we transport our knowledge of hypermedia in HTML to an API?
  34. Let's start by reformatting the HTML
  35. Replacing all attributes with common ones, makes it more consistent and more "API-like".
  36. Making further adjustments
  37. Like generating a new WSDL in the response to every request. Just like HTML.
  38. So, how can we use hypermedia in practice? As REST defines, hypermedia should be the engine of application state. Here’s what that means.
  39. Let's use a toaster as an example
  40. Initial state of a toaster is Off. We turn it on, and it reaches on status. We then adjust the heating strength and the toaster is now heating our bread. After it has been heating for a while, it reaches an upper temperature limit Bringing it into an idle state. When it reaches a lower temperature limit, it will go back into heating state. Eventually, the bread will be done and the toaster will enter the shutting down state Ending in the off state, just as we started.
  41. If we turn our toaster into an HTTP resource, how does it look like? Let's try to GET it.
  42. We can see that it has an off state
  43. We can also see that it has an operation that allows us to turn it on
  44. Let's look at that operation a little more closely
  45. If we just reformat it a little
  46. It starts looking like an HTTP request
  47. Well, look at that! The toaster is now on. We see that we can now turn it off again, but we can also increase the heating strength. By the way, does anyone notice anything different here?
  48. Ah. The toaster is now heating at strength 3. We see that we can still turn it off and adjust the strength. But what about that ID up there? Doesn't that look suspiciously like a URI?
  49. It seems the toaster has reached an upper temperature limit, putting it into an idle state. Although it may look like it, we did not alter the state of the toaster with our GET request. We just discovered that the state had changed, by doing a safe, idempotent request.
  50. Let's repeat the GET request and see what's happened. Seems like our bread is done and the toaster is shutting down. We now have no available operations, since we can't do anything while the toaster is shutting down.
  51. Getting back to versioning, when you use hypermedia, you're much more flexible: Adding properties to JSON is fine. Adding relations to new resources is fine. Adding new representations to the same resource is also fine. So we have a lot of ways we can guide new clients to new content without: Affecting old clients Adding a version number to our URIs
  52. You can reach me on: Twitter E-mail Slack. Join the HTTP API slack! It's full of great people in love with the web and APIs.