spring restbucks - a hypermedia-driven rest webservice

Post on 01-Nov-2014

2.078 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

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

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

A hypermedia-driven REST web service

Oliver Gierke

Spring RESTBucks

Oliver Gierke

Spring Data engineerCore / JPA / MongoJPA Expert Group

ogierke@vmware.comwww.olivergierke.deolivergierke

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!

Agenda IRESTBucks

Spring Data Introduction

Advanced Spring Data

Agenda IISpring Data REST

Spring MVC integration testing

Advanced Spring Data REST

RESTBucksAn introduction

RESTBucks

RESTBucksStarbucks (like) coffee ordering

Order / Payment

paymentexpected

1

paymentexpected

1

2

paymentexpected

cancelled

1

2

3

paymentexpected

preparing

cancelled

1

2

3

4

paymentexpected

preparing

cancelled

ready

1

2

3

4

5

paymentexpected

preparing

cancelled

ready completed

1

2

3

4

5 6

Spring RESTBucks

Spring RESTBucksSample implementation

Using Spring technologies

http://bit.ly/spring-restbucks

TechnologiesSpring Framework (4.0 M3)

Spring Data JPA (1.4.1 / Babbage)

Spring Data REST (2.0 snapshots)

Spring HATEOAS (0.8)

Web

Service

Repository

-

Orders

Spring Data

Spring DataREST

Payment

Spring Data

Manualimplementation

Manualimplementation

Demo

Web

Service

Repository

-

Orders

Spring Data

Spring DataREST

Payment

Spring Data

Manualimplementation

Manualimplementation

Spring DataConvenient data access layers

Spring DataGeneral introduction

Repositories abstraction

Lab

LabSetup Spring through JavaConfig

Setup JPA in Spring context

Enable Spring Data JPA

Write integration tests for data access

Spring Data RESTEasily export repositories to the web

REST Basics

REST in a nutshellResources

Identifier

Uniform interface

Representations

Hypermedia

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

(Ben Hale, SpringOne2GX 2012)

HypermediaClients driven by links

and their relation types

ImplementationPatterns

Resource per aggregate root

GET, PUT, POST, DELETE

Relations as links

Media type design

Spring Data REST

Spring Data RESTExport Spring Data repositories to the web

Allow configuration and extension

Lab

LabSetup Servlet 3.0 web app with Spring

Activate Spring Data REST

Spring MVC integration test setup

Write web integration tests

HypermediaDiving into hypermedia details

paymentexpected

preparing

cancelled

ready completed

1

2

3

4

5 6

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

Challenges

ChallengesHow to avoid hard coding URIs?

Use linkrelations

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

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

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

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

ChallengesHow to implement:

"only if payment expected"?

Processmodeling

Root resourceThe only URI known

GET /

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

Place orderAccess root resource

Follow orders link

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

POST /orders

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

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

Trigger paymentFollow payment link

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

PUT /orders/4711/payment

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

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

Poll orderFollow order link

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

GET /orders/4711

ETag / If-None-Match

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

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

Poll orderUse caching

ETag / If-None-Match

until…

{ 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 receiptFollow receipt link

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

GET /orders/4711/receipt

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

Conclude orderFollow receipt link

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

DELETE /orders/4711/receipt

Background

Hypermedia VS.Java Frameworks

HTTP Methods

URI Mapping

Contentnegotiation

Hypermedia

Spring MVC JAX-RS

? ?

Spring HATEOAS

Spring HATEOASRepresentation models

LinkBuilder API

Representation enrichment

http://bit.ly/spring-hateoas

DEMO

DEMO

MiscellaneousSpring MVC integration testing

REST Shell

Spring Data REST

Spring Data RESTExports JPA repositories as resources

Hypermedia driven representations

Extension points

http://bit.ly/sd-rest

REST Shell

Thank you!

Resources

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

Multi Client Development with Spring - Wed 4:30pm

VideosHypermedia APIs - Jon Moore

Hypermedia APIs with Spring

top related