spring restbucks - a hypermedia-driven rest webservice

81
© 2013 SpringOne 2GX. All rights reserved. Do not distribute without permission. A hypermedia-driven REST web service Oliver Gierke Spring RESTBucks

Upload: spring-io

Post on 01-Nov-2014

2.078 views

Category:

Technology


4 download

DESCRIPTION

Speakers: Oliver Gierke Spring MVC forms a solid foundation to implement REST based web-services in Java. However, in real-world projects developers still face challenges when it comes to advanced questions of REST. How to really leverage hypermedia? How to model more complex business functionality with REST. The talk introduces the Spring RESTBucks sample implementation of a hypermedia-driven REST web service and explains how it is using hypermedia elements to implement business processes and how Spring technologies (Spring Data REST, Spring Data JPA and Spring HATEOAS) help developers building the system.

TRANSCRIPT

Page 1: Spring RESTBucks - A hypermedia-driven REST webservice

© 2013 SpringOne 2GX. All rights reserved. Do not distribute without permission.

A hypermedia-driven REST web service

Oliver Gierke

Spring RESTBucks

Page 2: Spring RESTBucks - A hypermedia-driven REST webservice

Oliver Gierke

Spring Data engineerCore / JPA / MongoJPA Expert Group

[email protected]

Page 3: Spring RESTBucks - A hypermedia-driven REST webservice

Spring DataModern Data Access For Enterprise Java

NoSQL

JPAJDBC

Redis

Big Data Hadoop

HBase

MongoDB Neo4j REST exporterRoo

HivePig

Querydsl Repositories

Gemfire

Splunk

Free e-book for every attendee!

Page 4: Spring RESTBucks - A hypermedia-driven REST webservice

Agenda IRESTBucks

Spring Data Introduction

Advanced Spring Data

Page 5: Spring RESTBucks - A hypermedia-driven REST webservice

Agenda IISpring Data REST

Spring MVC integration testing

Advanced Spring Data REST

Page 6: Spring RESTBucks - A hypermedia-driven REST webservice

RESTBucksAn introduction

Page 7: Spring RESTBucks - A hypermedia-driven REST webservice
Page 8: Spring RESTBucks - A hypermedia-driven REST webservice

RESTBucks

Page 9: Spring RESTBucks - A hypermedia-driven REST webservice

RESTBucksStarbucks (like) coffee ordering

Order / Payment

Page 10: Spring RESTBucks - A hypermedia-driven REST webservice
Page 11: Spring RESTBucks - A hypermedia-driven REST webservice

paymentexpected

1

Page 12: Spring RESTBucks - A hypermedia-driven REST webservice

paymentexpected

1

2

Page 13: Spring RESTBucks - A hypermedia-driven REST webservice

paymentexpected

cancelled

1

2

3

Page 14: Spring RESTBucks - A hypermedia-driven REST webservice

paymentexpected

preparing

cancelled

1

2

3

4

Page 15: Spring RESTBucks - A hypermedia-driven REST webservice

paymentexpected

preparing

cancelled

ready

1

2

3

4

5

Page 16: Spring RESTBucks - A hypermedia-driven REST webservice

paymentexpected

preparing

cancelled

ready completed

1

2

3

4

5 6

Page 17: Spring RESTBucks - A hypermedia-driven REST webservice

Spring RESTBucks

Page 18: Spring RESTBucks - A hypermedia-driven REST webservice

Spring RESTBucksSample implementation

Using Spring technologies

http://bit.ly/spring-restbucks

Page 19: Spring RESTBucks - A hypermedia-driven REST webservice

TechnologiesSpring Framework (4.0 M3)

Spring Data JPA (1.4.1 / Babbage)

Spring Data REST (2.0 snapshots)

Spring HATEOAS (0.8)

Page 20: Spring RESTBucks - A hypermedia-driven REST webservice

Web

Service

Repository

-

Orders

Spring Data

Spring DataREST

Payment

Spring Data

Manualimplementation

Manualimplementation

Page 21: Spring RESTBucks - A hypermedia-driven REST webservice

Demo

Page 22: Spring RESTBucks - A hypermedia-driven REST webservice

Web

Service

Repository

-

Orders

Spring Data

Spring DataREST

Payment

Spring Data

Manualimplementation

Manualimplementation

Page 23: Spring RESTBucks - A hypermedia-driven REST webservice

Spring DataConvenient data access layers

Page 24: Spring RESTBucks - A hypermedia-driven REST webservice

Spring DataGeneral introduction

Repositories abstraction

Page 25: Spring RESTBucks - A hypermedia-driven REST webservice

Lab

Page 26: Spring RESTBucks - A hypermedia-driven REST webservice

LabSetup Spring through JavaConfig

Setup JPA in Spring context

Enable Spring Data JPA

Write integration tests for data access

Page 27: Spring RESTBucks - A hypermedia-driven REST webservice

Spring Data RESTEasily export repositories to the web

Page 28: Spring RESTBucks - A hypermedia-driven REST webservice

REST Basics

Page 29: Spring RESTBucks - A hypermedia-driven REST webservice

REST in a nutshellResources

Identifier

Uniform interface

Representations

Hypermedia

Page 30: Spring RESTBucks - A hypermedia-driven REST webservice

" HATEOAS - theword, there's no pronounciation for.

(Ben Hale, SpringOne2GX 2012)

Page 31: Spring RESTBucks - A hypermedia-driven REST webservice

HypermediaClients driven by links

and their relation types

Page 32: Spring RESTBucks - A hypermedia-driven REST webservice

ImplementationPatterns

Resource per aggregate root

GET, PUT, POST, DELETE

Relations as links

Media type design

Page 33: Spring RESTBucks - A hypermedia-driven REST webservice

Spring Data REST

Page 34: Spring RESTBucks - A hypermedia-driven REST webservice

Spring Data RESTExport Spring Data repositories to the web

Allow configuration and extension

Page 35: Spring RESTBucks - A hypermedia-driven REST webservice

Lab

Page 36: Spring RESTBucks - A hypermedia-driven REST webservice

LabSetup Servlet 3.0 web app with Spring

Activate Spring Data REST

Spring MVC integration test setup

Write web integration tests

Page 37: Spring RESTBucks - A hypermedia-driven REST webservice

HypermediaDiving into hypermedia details

Page 38: Spring RESTBucks - A hypermedia-driven REST webservice

paymentexpected

preparing

cancelled

ready completed

1

2

3

4

5 6

Page 39: Spring RESTBucks - A hypermedia-driven REST webservice

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 4

Barista preparing the orderBarista preparing the orderBarista preparing the orderBarista 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

Page 40: Spring RESTBucks - A hypermedia-driven REST webservice

Challenges

Page 41: Spring RESTBucks - A hypermedia-driven REST webservice

ChallengesHow to avoid hard coding URIs?

Page 42: Spring RESTBucks - A hypermedia-driven REST webservice

Use linkrelations

Page 43: Spring RESTBucks - A hypermedia-driven REST webservice

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.

paymentThe 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).

Page 44: Spring RESTBucks - A hypermedia-driven REST webservice

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.

paymentThe 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).

Page 45: Spring RESTBucks - A hypermedia-driven REST webservice

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 4

Barista preparing the orderBarista preparing the orderBarista preparing the orderBarista 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

Page 46: Spring RESTBucks - A hypermedia-driven REST webservice

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 4

Barista preparing the orderBarista preparing the orderBarista preparing the orderBarista preparing the order

GET order Poll order state 5

GET receipt Access receipt

DELETE receipt Conclude the order process 6

Page 47: Spring RESTBucks - A hypermedia-driven REST webservice

ChallengesHow to implement:

"only if payment expected"?

Page 48: Spring RESTBucks - A hypermedia-driven REST webservice

Processmodeling

Page 49: Spring RESTBucks - A hypermedia-driven REST webservice

Root resourceThe only URI known

GET /

Page 50: Spring RESTBucks - A hypermedia-driven REST webservice

{ links : [ { rel : "orders", href : "…/orders" } ]}

Page 51: Spring RESTBucks - A hypermedia-driven REST webservice

Place orderAccess root resource

Follow orders link

$.links[?(@.rel="orders")].href

POST /orders

Page 52: Spring RESTBucks - A hypermedia-driven REST webservice

{ links : [ { rel : "orders", href : "…/orders" } ]}

Page 53: Spring RESTBucks - A hypermedia-driven REST webservice

{ links : [ { rel : "self", href : … }, { rel : "cancel", href : … }, { rel : "update", href : … }, { 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" }}

Page 54: Spring RESTBucks - A hypermedia-driven REST webservice

Trigger paymentFollow payment link

$.links[?(@.rel="payment")].href

PUT /orders/4711/payment

Page 55: Spring RESTBucks - A hypermedia-driven REST webservice

{ 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" }}

Page 56: Spring RESTBucks - A hypermedia-driven REST webservice

{ links : [ { rel : "self", href : "…/orders/4711/payment" }, { rel : "order", href : "…/orders/4711" } ],

content : { creditCard : [ { number : "1234123412341234", cardHolder : "Oliver Gierke", expiryDate : "2013-11-01" } ], amount : { currency : "EUR", value : 4.2 } }}

Page 57: Spring RESTBucks - A hypermedia-driven REST webservice

Poll orderFollow order link

$.links[?(@.rel="order")].href

GET /orders/4711

ETag / If-None-Match

Page 58: Spring RESTBucks - A hypermedia-driven REST webservice

{ links : [ { rel : "self", href : "…/orders/4711/payment" }, { rel : "order", href : "…/orders/4711" } ],

content : { creditCard : [ { number : "1234123412341234", cardHolder : "Oliver Gierke", expiryDate : "2013-11-01" } ], amount : { currency : "EUR", value : 4.2 } }}

Page 59: Spring RESTBucks - A hypermedia-driven REST webservice

{ 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" }}

Page 60: Spring RESTBucks - A hypermedia-driven REST webservice

Poll orderUse caching

ETag / If-None-Match

until…

Page 61: Spring RESTBucks - A hypermedia-driven REST webservice

{ 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" }}

Page 62: Spring RESTBucks - A hypermedia-driven REST webservice

Access receiptFollow receipt link

$.links[?(@.rel="receipt")].href

GET /orders/4711/receipt

Page 63: Spring RESTBucks - A hypermedia-driven REST webservice

{ 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" }}

Page 64: Spring RESTBucks - A hypermedia-driven REST webservice

Conclude orderFollow receipt link

$.links[?(@.rel="receipt")].href

DELETE /orders/4711/receipt

Page 65: Spring RESTBucks - A hypermedia-driven REST webservice

Background

Page 66: Spring RESTBucks - A hypermedia-driven REST webservice

Hypermedia VS.Java Frameworks

Page 67: Spring RESTBucks - A hypermedia-driven REST webservice

HTTP Methods

URI Mapping

Contentnegotiation

Hypermedia

Spring MVC JAX-RS

? ?

Page 68: Spring RESTBucks - A hypermedia-driven REST webservice

Spring HATEOAS

Page 69: Spring RESTBucks - A hypermedia-driven REST webservice

Spring HATEOASRepresentation models

LinkBuilder API

Representation enrichment

http://bit.ly/spring-hateoas

Page 70: Spring RESTBucks - A hypermedia-driven REST webservice

DEMO

Page 71: Spring RESTBucks - A hypermedia-driven REST webservice

DEMO

Page 72: Spring RESTBucks - A hypermedia-driven REST webservice

MiscellaneousSpring MVC integration testing

REST Shell

Page 73: Spring RESTBucks - A hypermedia-driven REST webservice

Spring Data REST

Page 74: Spring RESTBucks - A hypermedia-driven REST webservice

Spring Data RESTExports JPA repositories as resources

Hypermedia driven representations

Extension points

http://bit.ly/sd-rest

Page 75: Spring RESTBucks - A hypermedia-driven REST webservice

REST Shell

Page 76: Spring RESTBucks - A hypermedia-driven REST webservice

Thank you!

Page 77: Spring RESTBucks - A hypermedia-driven REST webservice

Resources

Page 78: Spring RESTBucks - A hypermedia-driven REST webservice

Further talksSpring Data Repositories - Best practices - Wed 10:30am

Multi Client Development with Spring - Wed 4:30pm

Page 81: Spring RESTBucks - A hypermedia-driven REST webservice

VideosHypermedia APIs - Jon Moore

Hypermedia APIs with Spring