SlideShare a Scribd company logo
REST on steroids
    By Andrei Nefyodov
Representational State Transfer(REST) — set of architectural constraints

Constraint                Promotes                           At the expense of

Client-server             ●UI portability
                          ●Simplified server

                          ●Multiple organizational domains




Stateless                 ●Simplifiied server                Efficiency
                                                             ●

                          ●Scalability

                          ●Reliability


Optional non-shared       ●Reduced latency                   Reliability
                                                             ●

caching                   ●Efficiency

                          ●Scalability


Uniform interface         ●Visibility                        Efficiency
                                                             ●

                          ●Independent evolution

                          ●Decoupled implementation


Layered system            ●Shared caching                    Higher latency
                                                             ●

                          ●Legacy encapsulation

                          ●Simplified clients

                          ●Scalability

                          ●Load balancing


Optional code-on-demand   ●Simplified clients                Visibility
                                                             ●

                          ●Extensibility
Representational State Transfer(REST) — set of architectural constraints

Constraint                Promotes                            At the expense of
                                     Sub-constraints:
Client-server             ●UI portability
                                     ● Identification of resources
                          ●Simplified server
                                     ● Manipulation via representations
                          ●Multiple organizational domains
                                     ● Self-descriptive messages

                                     ●  Hypemedia as the engine of application state
Stateless                 ●Simplifiied server                 ●Efficiency

                          ●Scalability

                          ●Reliability


Optional non-shared       ●Reduced latency                    ●Reliability
caching                   ●Efficiency

                          ●Scalability


Uniform interface         ●Visibility                         ●Efficiency
                          ●Independent evolution

                          ●Decoupled implementation


Layered system            ●Shared caching                     ●Higher latency
                          ●Legacy encapsulation

                          ●Simplified clients

                          ●Scalability

                          ●Load balancing


Optional code-on-demand   ●Simplified clients                 ●Visibility
                          ●Extensibility
Representational State Transfer(REST) — set of architectural constraints

Constraint                Promotes                            At the expense of
                                     Sub-constraints:
Client-server             ●UI portability
                                     ● Identification of resources
                          ●Simplified server
                                     ● Manipulation via representations
                          ●Multiple organizational domains
                                     ● Self-descriptive messages

                                     ●  Hypemedia as the engine of application state
Stateless                 ●Simplifiied server                 ●Efficiency

                          ●Scalability

                          ●Reliability


Optional non-shared       ●Reduced latency                    ●Reliability
caching                   ●Efficiency

                          ●Scalability


Uniform interface         ●Visibility                         ●Efficiency

                          ●Independent evolution

                          ●Decoupled implementation You get these if
Layered system            ●Shared caching
                                                     you use HTTP latency
                                                              ●Higher

                          ●Legacy encapsulation
                                               as your application protocol
                          ●Simplified clients
                          ●Scalability

                          ●Load balancing


Optional code-on-demand   ●Simplified clients                 ●Visibility
                          ●Extensibility
Representational State Transfer(REST) — set of architectural constraints

Constraint                Promotes                            At the expense of
                                     Sub-constraints:
Client-server             ●UI portability
                                     ● Identification of resources
                          ●Simplified server
                                     ● Manipulation via representations
                          ●Multiple organizational domains
                                     ● Self-descriptive messages

                                     ●  Hypemedia as the engine of application state
Stateless                 ●Simplifiied server                 ●Efficiency

                          ●Scalability

                          ●Reliability


Optional non-shared       ●Reduced latency                    ●Reliability
caching                   ●Efficiency

                          ●Scalability


Uniform interface         ●Visibility                         ●Efficiency
                          ●Independent evolution

                          ●Decoupled implementation


Layered system            ●Shared caching                     ●Higher latency
                          ●Legacy encapsulation

                          ●Simplified clients

                          ●Scalability

                          ●Load balancing


Optional code-on-demand   ●Simplified clients                 ●Visibility
                          ●Extensibility
Hypermedia
●   Links in representations
●   State navigations discoverable
    HATEOAS — hypertext as the engine of
    application state. We express allowed state
    transitions through links.
●   Hypermedia constraint is an often-overlooked
    part of being RESTful
●   Using Hypermedia aware media type such as
    collection+json, XHTML promotes
➢   Loose coupling between client and server
➢   Simple documentation of semantic concepts
➢   Discoverability / testability / operability via
    «API surfing»
●   Much of the client framework is reusable
●   RESTBucks
●   Starbucks (like) coffee ordering
●   Order/payment
                                    5           6
                        Preparing       Ready       Completed

                    4
     2

1
         Payment
         expected


                         3


                        Cancelled
Method      URI                      Action              Step


POST        /orders                  Create new order    1


PUT/PATCH   /orders/4711             Update the order    2
                                     (only if «payment
                                     expected»)

DELETE      /orders/4711             Cancel order        3
                                     (only if «payment
                                     expected»)

PUT         /orders/4711/payment Pay order               4


                      Barista preparing the order


GET         /orders/4711             Poll order state    5


GET         /orders/4711/receipt     Access reciept


DELETE      /orders/4711/receipt     Conclude the        6
                                     order process
Challenges
How to avoid hard coding URIs?
Use link relations
Orders    Returns all orders available in the system

Order     Returns a single order

Self      The uri value can be used to GET the latest resource representation
          of the order.


Cancel    This is the URI to be used to DELETE the order resource should the
          consumer wish to cancel the order.


Update    Consumers can change the order using a POST to transfer a
          representation to the linked resource.


Payment   The linked resource allows the consumer to begin paying for an
          order. Initiating payment involves PUTting an appropriate resource
          representation to the specified URI.




Receipt   The URI to access the receipt using GET and conclude the order by
          taking the receipt (use DELETE).
Method      Relation type            Action              Step


POST        orders                   Create new order    1


PUT/PATCH   update                   Update the order    2
                                     (only if «payment
                                     expected»)

DELETE      cancel                   Cancel order        3
                                     (only if «payment
                                     expected»)

PUT         payment                  Pay order           4


                      Barista preparing the order


GET         order                    Poll order state    5


GET         receipt                  Access reciept


DELETE      receipt                  Conclude the        6
                                     order process
Challenges
How to implement «only if payment
expected»?
We can only navigate a link once it was
returned by the server
Place order
●   Access root resource
    { links : [ { rel : "orders",
                         href : "…/orders" }]
    }


●   Follow orders link
    $.links[?(@.rel="orders")].href
●   POST /orders
{
    links : [{
                 rel : "self",
                 href : "…/orders/4711"
                 },
        …
        …
                 {
                 rel : "payment",
                 href : "…/orders/4711/payment"
                 }    ],
    content : {
            items : [{
                      drink : "Cappucino",
                      size : "large",
                      milk : "semi"
                      price : 4.2
                 }
            ],
            location : "take-away",
            price : 4.2
            status : "payment expected"
    }
}
Trigger payment
●   Follow payment link
●   $.links[?(@.rel="payment")].href
●   PUT /orders/4711/payment
{
    links : [{
              rel : "self",
              href : "…/orders/4711/payment"
         }, {
              rel : "order",
              href : "…/orders/4711"
         }
    ],
    content : {
         creditCard : [{
                  number : "1234123412341234",
                  cardHolder : "Ivan Ivanov",
                  expiryDate : "2013-11-01"
              }
         ],
         amount : {
              currency : "EUR",
              value : 4.2
         }
    }
}
Poll order
●   Follow order link
    $.links[?(@.rel="order")].href
●   GET /orders/4711
●   ETag / If-None-Match
{
    links : [{
              rel : "self",
              href : "…/orders/4711"
         }
    ],
    content : {
         items : [{
                  drink : "Cappucino",
                  size : "large",
                  milk : "semi"
                  price : 4.2
              }
         ],
         location : "take-away",
         price : 4.2
         status : "preparing"
    }
}
{
    links : [{
              rel : "self",
              href : "…/orders/4711"
         }, {
              rel : "receipt",
              href : "…/orders/4711/receipt"
         }
    ],
    content : {
         items : [{
                  drink : "Cappucino",
                  size : "large",
                  milk : "semi"
                  price : 4.2
              }
         ],
         location : "take-away",
         price : 4.2
         status : "ready"
    }
}
Access receipt
●   Follow receipt link
●   $.links[?(@.rel="receipt")].href
●   GET /orders/4711/receipt


                  Conclude order
●   Follow receipt link
●   $.links[?(@.rel="receipt")].href
●   DELETE /orders/4711/receipt
DEMO
Summary
●   Hypermedia — is often overlooked constaint of REST. In exchange you
    get independent evolution and decoupled implementation.
●   Spring HATEOAS - http://bit.ly/spring-hateoas
●   Representation models
●   LinkBuilderAPI
●   Representation enrichment

●   Spring Data REST - http://bit.ly/sd-rest
●   Exports JPA repositories as resources
●   Hypermedia driven representations
●   Extension points

●   REST Shell - github.com/SpringSource/rest-shell
●   Explore REST webservices
●   Hypermedia driven
●   Spring HATEOAS link format

●   Spring RESTBucks - http://bit.ly/spring-restbucks
●   Sample implementation
●   Using Spring technologies

●   Lombok — projectlombok.org
•   get rid of boilerplate
QUESTIONS?

More Related Content

Similar to Rest on steroids

Red Hat Storage - Introduction to GlusterFS
Red Hat Storage - Introduction to GlusterFSRed Hat Storage - Introduction to GlusterFS
Red Hat Storage - Introduction to GlusterFS
GlusterFS
 
Cpp In Soa
Cpp In SoaCpp In Soa
Cpp In Soa
WSO2
 
Private Clouds - Business Agility Seminar
Private Clouds - Business Agility SeminarPrivate Clouds - Business Agility Seminar
Private Clouds - Business Agility Seminar
Exponential_e
 
01 zingme practice for building scalable website with php
01 zingme practice for building scalable website with php01 zingme practice for building scalable website with php
01 zingme practice for building scalable website with php
Nguyen Duc Phu
 
Zingme practice for building scalable website with PHP
Zingme practice for building scalable website with PHPZingme practice for building scalable website with PHP
Zingme practice for building scalable website with PHP
Chau Thanh
 
Zingme practice for building scalable website with PHP
Zingme practice for building scalable website with PHPZingme practice for building scalable website with PHP
Zingme practice for building scalable website with PHP
Võ Duy Tuấn
 
zingmepracticeforbuildingscalablewebsitewithphp
zingmepracticeforbuildingscalablewebsitewithphpzingmepracticeforbuildingscalablewebsitewithphp
zingmepracticeforbuildingscalablewebsitewithphp
hazzaz
 
Commonsense Linux sysad and scaling of webapps in the cloud
Commonsense Linux sysad and scaling of webapps in the cloudCommonsense Linux sysad and scaling of webapps in the cloud
Commonsense Linux sysad and scaling of webapps in the cloud
mkpai
 

Similar to Rest on steroids (20)

2018 jk
2018 jk2018 jk
2018 jk
 
QLogic Adapters & Virtualized Environments
QLogic Adapters & Virtualized EnvironmentsQLogic Adapters & Virtualized Environments
QLogic Adapters & Virtualized Environments
 
Modern architecture
Modern architectureModern architecture
Modern architecture
 
Red Hat Storage - Introduction to GlusterFS
Red Hat Storage - Introduction to GlusterFSRed Hat Storage - Introduction to GlusterFS
Red Hat Storage - Introduction to GlusterFS
 
Cpp In Soa
Cpp In SoaCpp In Soa
Cpp In Soa
 
Identity Server on Azure: A Reference Architecture
Identity Server on Azure: A Reference ArchitectureIdentity Server on Azure: A Reference Architecture
Identity Server on Azure: A Reference Architecture
 
What's new in confluent platform 5.4 online talk
What's new in confluent platform 5.4 online talkWhat's new in confluent platform 5.4 online talk
What's new in confluent platform 5.4 online talk
 
Private Clouds - Business Agility Seminar
Private Clouds - Business Agility SeminarPrivate Clouds - Business Agility Seminar
Private Clouds - Business Agility Seminar
 
01 zingme practice for building scalable website with php
01 zingme practice for building scalable website with php01 zingme practice for building scalable website with php
01 zingme practice for building scalable website with php
 
Zingme practice for building scalable website with PHP
Zingme practice for building scalable website with PHPZingme practice for building scalable website with PHP
Zingme practice for building scalable website with PHP
 
Zingme practice for building scalable website with PHP
Zingme practice for building scalable website with PHPZingme practice for building scalable website with PHP
Zingme practice for building scalable website with PHP
 
zingmepracticeforbuildingscalablewebsitewithphp
zingmepracticeforbuildingscalablewebsitewithphpzingmepracticeforbuildingscalablewebsitewithphp
zingmepracticeforbuildingscalablewebsitewithphp
 
Dynomite @ RedisConf 2017
Dynomite @ RedisConf 2017Dynomite @ RedisConf 2017
Dynomite @ RedisConf 2017
 
Commonsense Linux sysad and scaling of webapps in the cloud
Commonsense Linux sysad and scaling of webapps in the cloudCommonsense Linux sysad and scaling of webapps in the cloud
Commonsense Linux sysad and scaling of webapps in the cloud
 
AdaLabs FOSDEM 2012 Ada on Rails
AdaLabs FOSDEM 2012 Ada on RailsAdaLabs FOSDEM 2012 Ada on Rails
AdaLabs FOSDEM 2012 Ada on Rails
 
RedisConf17 - Dynomite - Making Non-distributed Databases Distributed
RedisConf17 - Dynomite - Making Non-distributed Databases DistributedRedisConf17 - Dynomite - Making Non-distributed Databases Distributed
RedisConf17 - Dynomite - Making Non-distributed Databases Distributed
 
IBM System Networking SAN24B-5 switch
IBM System Networking SAN24B-5 switchIBM System Networking SAN24B-5 switch
IBM System Networking SAN24B-5 switch
 
Clavister security for virtualized environment
Clavister security for virtualized environmentClavister security for virtualized environment
Clavister security for virtualized environment
 
Microservices Architecture
Microservices ArchitectureMicroservices Architecture
Microservices Architecture
 
Cloud Computing
Cloud ComputingCloud Computing
Cloud Computing
 

Recently uploaded

Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo DiehlFuture Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Peter Udo Diehl
 
Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with Parameters
Safe Software
 

Recently uploaded (20)

Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
 
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
AI for Every Business: Unlocking Your Product's Universal Potential by VP of ...
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
 
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo DiehlFuture Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
 
Demystifying gRPC in .Net by John Staveley
Demystifying gRPC in .Net by John StaveleyDemystifying gRPC in .Net by John Staveley
Demystifying gRPC in .Net by John Staveley
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
 
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptx
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptxUnpacking Value Delivery - Agile Oxford Meetup - May 2024.pptx
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptx
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
 
Quantum Computing: Current Landscape and the Future Role of APIs
Quantum Computing: Current Landscape and the Future Role of APIsQuantum Computing: Current Landscape and the Future Role of APIs
Quantum Computing: Current Landscape and the Future Role of APIs
 
Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with Parameters
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
Exploring UiPath Orchestrator API: updates and limits in 2024 🚀
 
In-Depth Performance Testing Guide for IT Professionals
In-Depth Performance Testing Guide for IT ProfessionalsIn-Depth Performance Testing Guide for IT Professionals
In-Depth Performance Testing Guide for IT Professionals
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
ODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User Group
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
 

Rest on steroids

  • 1. REST on steroids By Andrei Nefyodov
  • 2. Representational State Transfer(REST) — set of architectural constraints Constraint Promotes At the expense of Client-server ●UI portability ●Simplified server ●Multiple organizational domains Stateless ●Simplifiied server Efficiency ● ●Scalability ●Reliability Optional non-shared ●Reduced latency Reliability ● caching ●Efficiency ●Scalability Uniform interface ●Visibility Efficiency ● ●Independent evolution ●Decoupled implementation Layered system ●Shared caching Higher latency ● ●Legacy encapsulation ●Simplified clients ●Scalability ●Load balancing Optional code-on-demand ●Simplified clients Visibility ● ●Extensibility
  • 3. Representational State Transfer(REST) — set of architectural constraints Constraint Promotes At the expense of Sub-constraints: Client-server ●UI portability ● Identification of resources ●Simplified server ● Manipulation via representations ●Multiple organizational domains ● Self-descriptive messages ● Hypemedia as the engine of application state Stateless ●Simplifiied server ●Efficiency ●Scalability ●Reliability Optional non-shared ●Reduced latency ●Reliability caching ●Efficiency ●Scalability Uniform interface ●Visibility ●Efficiency ●Independent evolution ●Decoupled implementation Layered system ●Shared caching ●Higher latency ●Legacy encapsulation ●Simplified clients ●Scalability ●Load balancing Optional code-on-demand ●Simplified clients ●Visibility ●Extensibility
  • 4. Representational State Transfer(REST) — set of architectural constraints Constraint Promotes At the expense of Sub-constraints: Client-server ●UI portability ● Identification of resources ●Simplified server ● Manipulation via representations ●Multiple organizational domains ● Self-descriptive messages ● Hypemedia as the engine of application state Stateless ●Simplifiied server ●Efficiency ●Scalability ●Reliability Optional non-shared ●Reduced latency ●Reliability caching ●Efficiency ●Scalability Uniform interface ●Visibility ●Efficiency ●Independent evolution ●Decoupled implementation You get these if Layered system ●Shared caching you use HTTP latency ●Higher ●Legacy encapsulation as your application protocol ●Simplified clients ●Scalability ●Load balancing Optional code-on-demand ●Simplified clients ●Visibility ●Extensibility
  • 5. Representational State Transfer(REST) — set of architectural constraints Constraint Promotes At the expense of Sub-constraints: Client-server ●UI portability ● Identification of resources ●Simplified server ● Manipulation via representations ●Multiple organizational domains ● Self-descriptive messages ● Hypemedia as the engine of application state Stateless ●Simplifiied server ●Efficiency ●Scalability ●Reliability Optional non-shared ●Reduced latency ●Reliability caching ●Efficiency ●Scalability Uniform interface ●Visibility ●Efficiency ●Independent evolution ●Decoupled implementation Layered system ●Shared caching ●Higher latency ●Legacy encapsulation ●Simplified clients ●Scalability ●Load balancing Optional code-on-demand ●Simplified clients ●Visibility ●Extensibility
  • 6. Hypermedia ● Links in representations ● State navigations discoverable HATEOAS — hypertext as the engine of application state. We express allowed state transitions through links.
  • 7. Hypermedia constraint is an often-overlooked part of being RESTful ● Using Hypermedia aware media type such as collection+json, XHTML promotes ➢ Loose coupling between client and server ➢ Simple documentation of semantic concepts ➢ Discoverability / testability / operability via «API surfing» ● Much of the client framework is reusable
  • 8. RESTBucks ● Starbucks (like) coffee ordering ● Order/payment 5 6 Preparing Ready Completed 4 2 1 Payment expected 3 Cancelled
  • 9. Method URI Action Step POST /orders Create new order 1 PUT/PATCH /orders/4711 Update the order 2 (only if «payment expected») DELETE /orders/4711 Cancel order 3 (only if «payment expected») PUT /orders/4711/payment Pay order 4 Barista preparing the order GET /orders/4711 Poll order state 5 GET /orders/4711/receipt Access reciept DELETE /orders/4711/receipt Conclude the 6 order process
  • 10. Challenges How to avoid hard coding URIs?
  • 12. Orders Returns all orders available in the system Order Returns a single order Self The uri value can be used to GET the latest resource representation of the order. Cancel This is the URI to be used to DELETE the order resource should the consumer wish to cancel the order. Update Consumers can change the order using a POST to transfer a representation to the linked resource. Payment The linked resource allows the consumer to begin paying for an order. Initiating payment involves PUTting an appropriate resource representation to the specified URI. Receipt The URI to access the receipt using GET and conclude the order by taking the receipt (use DELETE).
  • 13. Method Relation type Action Step POST orders Create new order 1 PUT/PATCH update Update the order 2 (only if «payment expected») DELETE cancel Cancel order 3 (only if «payment expected») PUT payment Pay order 4 Barista preparing the order GET order Poll order state 5 GET receipt Access reciept DELETE receipt Conclude the 6 order process
  • 14. Challenges How to implement «only if payment expected»?
  • 15. We can only navigate a link once it was returned by the server
  • 16. Place order ● Access root resource { links : [ { rel : "orders", href : "…/orders" }] } ● Follow orders link $.links[?(@.rel="orders")].href ● POST /orders
  • 17. { links : [{ rel : "self", href : "…/orders/4711" }, … … { rel : "payment", href : "…/orders/4711/payment" } ], content : { items : [{ drink : "Cappucino", size : "large", milk : "semi" price : 4.2 } ], location : "take-away", price : 4.2 status : "payment expected" } }
  • 18. Trigger payment ● Follow payment link ● $.links[?(@.rel="payment")].href ● PUT /orders/4711/payment
  • 19. { links : [{ rel : "self", href : "…/orders/4711/payment" }, { rel : "order", href : "…/orders/4711" } ], content : { creditCard : [{ number : "1234123412341234", cardHolder : "Ivan Ivanov", expiryDate : "2013-11-01" } ], amount : { currency : "EUR", value : 4.2 } } }
  • 20. Poll order ● Follow order link $.links[?(@.rel="order")].href ● GET /orders/4711 ● ETag / If-None-Match
  • 21. { links : [{ rel : "self", href : "…/orders/4711" } ], content : { items : [{ drink : "Cappucino", size : "large", milk : "semi" price : 4.2 } ], location : "take-away", price : 4.2 status : "preparing" } }
  • 22. { links : [{ rel : "self", href : "…/orders/4711" }, { rel : "receipt", href : "…/orders/4711/receipt" } ], content : { items : [{ drink : "Cappucino", size : "large", milk : "semi" price : 4.2 } ], location : "take-away", price : 4.2 status : "ready" } }
  • 23. Access receipt ● Follow receipt link ● $.links[?(@.rel="receipt")].href ● GET /orders/4711/receipt Conclude order ● Follow receipt link ● $.links[?(@.rel="receipt")].href ● DELETE /orders/4711/receipt
  • 24. DEMO
  • 25. Summary ● Hypermedia — is often overlooked constaint of REST. In exchange you get independent evolution and decoupled implementation. ● Spring HATEOAS - http://bit.ly/spring-hateoas ● Representation models ● LinkBuilderAPI ● Representation enrichment ● Spring Data REST - http://bit.ly/sd-rest ● Exports JPA repositories as resources ● Hypermedia driven representations ● Extension points ● REST Shell - github.com/SpringSource/rest-shell ● Explore REST webservices ● Hypermedia driven ● Spring HATEOAS link format ● Spring RESTBucks - http://bit.ly/spring-restbucks ● Sample implementation ● Using Spring technologies ● Lombok — projectlombok.org • get rid of boilerplate