Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Hypermedia APIs with Spring

Hypermedia APIs with Spring

Slides of my talk on hypermedia APIs I held at XConf 2014 in Hamburg. @springcentral

Oliver Drotbohm

September 23, 2014
Tweet

More Decks by Oliver Drotbohm

Other Decks in Programming

Transcript

  1. "What needs to be done to make the REST architectural

    style clear on the notion that hypertext is a constraint? In other words, if the engine of application state (and hence the API) is not being driven by hypertext, then it cannot be RESTful and cannot be a REST API. Period. Is there some broken manual somewhere that needs to be fixed?
 
 – Roy T. Fielding
  2. { items : [ { … } ], location :

    "take-away", price : 4.2, status : "payment expected" }
  3. { _links : { self : { href : …

    }, cancel : { href : … }, update : { href : … }, payment : { href : "…/orders/4711/payment" } }, ! items : [ { … } ], location : "take-away", price : 4.2, status : "payment expected" }
  4. Method URI Action Step POST /orders Create new order 1

    POST/PATCH /orders/4711 Update the order (only if "payment expected") 2 DELETE /orders/4711 Cancel order (only if "payment expected") 3 PUT /orders/4711/payment Pay order (only if "payment expected") 4 Barista preparing the order GET /orders/4711 Poll order state 5 GET /orders/4711/receipt Access receipt DELETE /orders/4711/receipt Conclude the order process 6
  5. 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).
  6. 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).
  7. Method URI Action Step POST /orders Create new order 1

    POST/PATCH /orders/4711 Update the order (only if "payment expected") 2 DELETE /orders/4711 Cancel order (only if "payment expected") 3 PUT /orders/4711/payment Pay order (only if "payment expected") 4 Barista preparing the order GET /orders/4711 Poll order state 5 GET /orders/4711/receipt Access receipt DELETE /orders/4711/receipt Conclude the order process 6
  8. Method Relation type Action Step POST orders Create new order

    1 POST/PATCH update Update the order (only if "payment expected") 2 DELETE cancel Cancel order (only if "payment expected") 3 PUT payment Pay order (only if "payment expected") 4 Barista preparing the order GET order Poll order state 5 GET receipt Access receipt DELETE receipt Conclude the order process 6
  9. { _links : { self : { href : …

    }, cancel : { href : … }, update : { href : … }, payment : { href : "…/orders/4711/payment" } }, ! items : [ { … } ], location : "take-away", price : 4.2, status : "payment expected" }
  10. { _links : { self : { href : "…/orders/4711"

    }, … payment : { href : "…/orders/4711/payment" } }, ! items : [ { … } ], location : "take-away", price : 4.2, status : "payment expected" }
  11. { _links : { self : { href : "…/orders/4711/payment"

    }, order : { href : "…/orders/4711" } }, ! creditCard : { … }, amount : { currency : "EUR", value : 4.2 } }
  12. { _links : { self : { href : "…/orders/4711/payment"

    }, order : { href : "…/orders/4711" }, }, ! creditCard : { … }, amount : { currency : "EUR", value : 4.2 } }
  13. { _links : { self : { href : "…/orders/4711"

    } }, ! items : [ { … } ], location : "take-away", price : 4.2, status : "preparing" }
  14. { _links : { self : { href : "…/orders/4711"

    }, … receipt : { href : "…/orders/4711/receipt" } }, ! items : [ { … } ], location : "take-away", price : 4.2, status : "payment expected" }
  15. { _links : { self : { href : "…/orders/4711"

    }, … receipt : { href : "…/orders/4711/receipt" } }, ! items : [ { … } ], location : "take-away", price : 4.2, status : "payment expected" }
  16. Web Service Repository - Orders Spring Data Spring Data
 REST

    Payment Spring Data Manual
 implementation Manual
 implementation
  17. { "_links" : { "self" : { "href" : …

    }, "restbucks:cancel" : { "href" : … }, "restbucks:update" : { "href" : … }, ! "curies" : { "name" : "restbucks", "href" : "…/rels/{rel}" "templated" : true } }, … } Docs for update are at: …/rels/update
  18. alps.io Application Level Profile Semantics Describe state transitions and payloads

    Media type agnostic Repository with pre-defined docs application/alps+(json|xml)