Top Banner
© 2013 SpringOne 2GX. All rights reserved. Do not distribute without permission. Building Smart Clients with Spring by Josh Long and Roy Clarkson
62

Multi-Client Development with Spring

May 07, 2015

Download

Technology

Spring IO

Speakers: Roy Clarkson and Josh Long
No application is an island and this is more obvious today than ever as applications extend their reach into people's pockets, desktops, tablets, TVs, Blu-ray players and cars. What's a modern developer to do to support these many platforms? In this talk, join Josh Long to learn how Spring can extend your reach through (sometimes Spring Security OAuth-secured) RESTful services exposed through Spring MVC, HTML5 and client-specific rendering thanks to Spring Mobile, and powerful, native support for Android with Spring Android.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Multi-Client Development with Spring

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

Building Smart Clients with Springby Josh Long and Roy Clarkson

Page 2: Multi-Client Development with Spring

WHAT IS REST?

REST is an architectural constraint based on HTTP 1.1, and created as part of Roy Fielding’s doctoral dissertation in 2000.

It embraces HTTP.

It’s a style, not a standard

http://en.wikipedia.org/wiki/Representational_state_transfer

Page 3: Multi-Client Development with Spring

WHAT IS REST?

REST has no hard and fast rules.REST is an architectural style, not a standard.

REST uses Headers to describe requests & responses

REST embraces HTTP verbs

Page 4: Multi-Client Development with Spring

HTTP VERBS

GET /users/21

GET requests retrieve information.

GET can have side-effects (but it’s unexpected)

GET can be conditional, or partial: If-Modified-Since, Range

Page 5: Multi-Client Development with Spring

HTTP VERBS

DELETE requests that a resource be removed, though the deletion doesn’t have to be immediate.

DELETE /users/21

Page 6: Multi-Client Development with Spring

HTTP VERBS

POST requests that the resource do something with the enclosed entity

POST can be used to create or update.

POST /users { “firstName”: “Juergen” }

Page 7: Multi-Client Development with Spring

HTTP VERBS

PUT requests that the entity be stored at a URI

PUT can be used to create or update.

PUT /users/21{ “firstName”: “Juergen” }

Page 8: Multi-Client Development with Spring

THE MATURITY MODEL

The Richardson Maturity Model is a way to grade your API according to the REST constraints with 4 levels of increasing compliance

http://martinfowler.com/articles/richardsonMaturityModel.html

Page 9: Multi-Client Development with Spring

THE MATURITY MODEL

The Richardson Maturity Model

Level 0: swamp of POX

http://martinfowler.com/articles/richardsonMaturityModel.html

Uses HTTP mainly as a tunnel through one URI e.g., SOAP, XML-RPC

Usually features on HTTP verb (POST)

Page 10: Multi-Client Development with Spring

THE MATURITY MODEL

The Richardson Maturity Model

Level 1: resources

http://martinfowler.com/articles/richardsonMaturityModel.html

Multiple URIs to distinguish related nouns e.g., /articles/1, /articles/2, vs. just /articles

Page 11: Multi-Client Development with Spring

THE MATURITY MODEL

The Richardson Maturity Model

Level 2: HTTP verbs

http://martinfowler.com/articles/richardsonMaturityModel.html

leverage transport-native properties to enhance service e.g., HTTP GET and PUT and DELETE and POST

Uses idiomatic HTTP controls like status codes, headers

Page 12: Multi-Client Development with Spring

HTTP VERBS

GET /users/21

DELETE /users/21

POST /users

PUT /users/21

retrieves a resource from a URI

removes the resource

creates a new record; returns a Location

updates a resource

<filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <url-pattern>/</url-pattern> <servlet-name>appServlet</servlet-name> </filter-mapping>

Page 13: Multi-Client Development with Spring

STATUS CODES

status codes convey the result of the server’s attempt to satisfy the request.

Categories:

1xx: informational 2xx: success 3xx: redirection 4xx: client error 5xx: server error

Page 14: Multi-Client Development with Spring

REST 101

200 OK - Everything worked

201 Created - Returns a Location header for new resource

202 Accepted - server has accepted the request, but it is not yet complete. Status URI optionally conveyed in Location header

Page 15: Multi-Client Development with Spring

REST DESIGN WITH SPRINGREST 101

ACCEPTABLE406:NOT

Page 16: Multi-Client Development with Spring

REST 101

400 Bad Request - Malformed Syntax. Retry with change.

401 Unauthorized - authentication is required

403 Forbidden - server has understood, but refuses request

404 Not Found - server can’t find a resource for URI

406 Not Found - incompatible Accept headers specified

409 Conflict - resource conflicts with client request

Page 17: Multi-Client Development with Spring

REST 101

Clients and services must agree on a representation media type through content negotiation.

Client specifies what it wants through Accept header

Server specifies what it produces through Content-Type header

Page 18: Multi-Client Development with Spring

REST 101

Spring MVC supports multiple types of content negotiation through its ContentNegotiationStrategy: e.g., Accept header, URL extension, request parameters, or a fixed type

Page 19: Multi-Client Development with Spring

DemonstrationBasic RESTful service, REST shells

Page 20: Multi-Client Development with Spring

HATEOAS

The Richardson Maturity Model

Level 3: Hypermedia Controls (aka, HATEOAS)

http://martinfowler.com/articles/richardsonMaturityModel.html

No a priori knowledge of service requiredNavigation options are provided by service and hypermedia controls

Promotes longevity through a uniform interface

Page 21: Multi-Client Development with Spring

HATEOAS

Links provide possible navigations from a given resource

Links are dynamic, based on resource state.

<link href=“http://...:8080/users/232/customers” rel= “customers”/>

Page 22: Multi-Client Development with Spring

DemonstrationSpring HATEOAS, Rest Shell

Page 23: Multi-Client Development with Spring

SPRING DATA REST

Spring Data REST simplifies the generic data-centric @Controllers

Builds on top of Spring Data Repository support:

@RestResource (path = "users", rel = "users")

public interface UserRepository extends PagingAndSortingRepository<User, Long> {

User findByUsername(@Param ("username") String username);

Page 24: Multi-Client Development with Spring

SPRING DATA REST

Spring Data REST simplifies the generic data-centric @Controllers

Builds on top of Spring Data Repository support:

@RestResource (path = "users", rel = "users")

public interface UserRepository extends PagingAndSortingRepository<User, Long> {

User findByUsername(@Param ("username") String username);

select u from User where u.username = ?

Page 25: Multi-Client Development with Spring

SPRING DATA REST

Spring Data REST simplifies the generic data-centric @Controllers

Builds on top of Spring Data Repository support:

@RestResource (path = "users", rel = "users")

public interface UserRepository extends PagingAndSortingRepository<User, Long> {

List<User> findUsersByFirstNameOrLastNameOrUsername( @Param ("firstName") String firstName, @Param ("lastName") String lastName, @Param ("username") String username);}

Page 26: Multi-Client Development with Spring

SPRING DATA REST

Spring Data REST simplifies the generic data-centric @Controllers

Builds on top of Spring Data Repository support:

@RestResource (path = "users", rel = "users")

public interface UserRepository extends PagingAndSortingRepository<User, Long> {

List<User> findUsersByFirstNameOrLastNameOrUsername( @Param ("firstName") String firstName, @Param ("lastName") String lastName, @Param ("username") String username);}

select u from User u where u.username = ? or u.firstName = ? or u.lastName = ?

Page 27: Multi-Client Development with Spring

DemonstrationSpring Data, Spring Data REST

Page 28: Multi-Client Development with Spring

SECURITY

Security can be as simple, or complex, as you want...

If you can trust the client to keep a secret like a password:

...HTTP Basic if you have TLS ... HTTP Digest if you want extra security

Page 29: Multi-Client Development with Spring

OAUTH

Security can be as simple, or complex, as you want...

Can’t trust the client to keep a secret? (HTML page?)

Application has a user context and you don’t want clients to have a user’s password?

...use OAuth

Page 30: Multi-Client Development with Spring

OAUTH

Page 31: Multi-Client Development with Spring

OAUTH

Page 32: Multi-Client Development with Spring

OAUTH

Page 33: Multi-Client Development with Spring

DemonstrationSpring Security OAuth

Page 34: Multi-Client Development with Spring

SPRING SOCIAL

Spring Social provides an authentication and authorization client for OAuth (1.0, 1.0a, 2.0)

Provides type-safe API bindings for various services

Page 35: Multi-Client Development with Spring

BINDINGS...

Page 36: Multi-Client Development with Spring

...LOTS OF BINDINGS

Page 37: Multi-Client Development with Spring

DemonstrationSpring Social

Page 38: Multi-Client Development with Spring

SPRING ANDROID

Spring Social provides an authentication and authorization client for OAuth (1.0, 1.0a, 2.0)

Provides type-safe API bindings for various services

Page 39: Multi-Client Development with Spring

SPRING ANDROID

Spring Android brings Spring core’s RestTemplate.

Spring Social and Spring HATEOAS work as well.

Page 40: Multi-Client Development with Spring

SPRING ANDROID

More than 500,000 activations every day

More than 500,000 activations every day

Page 41: Multi-Client Development with Spring

DemonstrationSpring Android-powered UI client

Page 42: Multi-Client Development with Spring

USING REST AND OAUTH FROM IOS

Page 43: Multi-Client Development with Spring

REST DESIGN WITH SPRING

iOS provides an HTTP client (NSURLConnection), a JSON processor (NSJSONSerialization), and a rich set of data structures (NSData, NSDictionary, and NSArray)

Page 44: Multi-Client Development with Spring

BASIC HTTP REQUEST

NSURL *url = [NSURL URLWithString:@"http://localhost"];NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];

NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

Page 45: Multi-Client Development with Spring

BASIC HTTP REQUEST... IMPROVED

NSURL *url = [NSURL URLWithString:@"http://localhost"];NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];NSURLResponse *response;NSError *error;NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];NSInteger status = [(NSHTTPURLResponse *)response statusCode];if (status == 200 && data.length > 0 && error == nil){

// do something with data}

Page 46: Multi-Client Development with Spring

ASYNCHRONOUS HTTP REQUESTS

NSURL *url = [NSURL URLWithString:@"http://localhost"];NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){

NSInteger status = [(NSHTTPURLResponse *)response statusCode];if (status == 200 && data.length > 0 && error == nil){

// do something with data}

}

Page 47: Multi-Client Development with Spring

HTTP HEADERS

NSURL *url = [NSURL URLWithString:@"http://localhost"];NSMutableURLRequest *request =

[[NSMutableURLRequest alloc] initWithURL:url];

[request setHTTPMethod:@"PUT"];

[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

[request setValue:contentLength forHTTPHeaderField:@"Content-Length"];

[request setHTTPBody:postData];

Page 48: Multi-Client Development with Spring

JSON SERIALIZATION

// deserialize JSON dataNSError *error;NSDictionary *d = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];

// serialize JSON dataNSError *error;NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error];

Page 49: Multi-Client Development with Spring

• HTTP Client– NSURLConnection

• JSON Processor (iOS 5)– NSJSONSerialization

• Data– NSData– NSDictionary– NSArray

49

Page 50: Multi-Client Development with Spring

• Loading Data Synchronously

+ sendSynchronousRequest:returningResponse:error:

• Loading Data Asynchronously

+ sendAsynchronousRequest:queue:completionHandler:

50

Page 51: Multi-Client Development with Spring

51

NSURL *url = [NSURL URLWithString:@"http://localhost"];NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];

NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

Page 52: Multi-Client Development with Spring

52

NSURL *url = [NSURL URLWithString:@"http://localhost"];NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];NSURLResponse *response;NSError *error;NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];NSInteger status = [(NSHTTPURLResponse *)response statusCode];if (status == 200 && data.length > 0 && error == nil){

// do something with data}

Page 53: Multi-Client Development with Spring

53

NSURL *url = [NSURL URLWithString:@"http://localhost"];NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){

NSInteger status = [(NSHTTPURLResponse *)response statusCode];if (status == 200 && data.length > 0 && error == nil){

// do something with data}

}

Page 54: Multi-Client Development with Spring

54

NSURL *url = [NSURL URLWithString:@"http://localhost"];NSMutableURLRequest *request =

[[NSMutableURLRequest alloc] initWithURL:url];

[request setHTTPMethod:@"PUT"];

[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

[request setValue:contentLength forHTTPHeaderField:@"Content-Length"];

[request setHTTPBody:postData];

Page 55: Multi-Client Development with Spring

55

// deserialize JSON dataNSError *error;NSDictionary *d = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];

// serialize JSON dataNSError *error;NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error];

Page 56: Multi-Client Development with Spring

iOS Demo

Page 57: Multi-Client Development with Spring

Q&A

Page 60: Multi-Client Development with Spring

GREAT RESOURCES

Roy Fielding’s Dissertation introduces REST http://www.ics.uci.edu/~fielding/pubs/dissertation/evaluation.htm#sec_6_1%7C

The Spring REST Shell http://github.com/jbrisbin/rest-shell

Spring Security, Security OAuth, Spring Data REST, HATEOAS, Social http://github.com/SpringSource

Spring MVC Test Framework http://static.springsource.org/spring-framework/docs/current/spring-framework-reference/html/testing.html#spring-mvc-test-framework

Page 61: Multi-Client Development with Spring

GREAT RESOURCES

Oliver Gierke’s talk on Hypermedia from Øredev @ http://vimeo.com/53214577

Lez Hazelwood’s talk on designing a beautiful JSON+REST API

Ben Hale’s talk on REST API design with Spring from SpringOne2GX 2012 @ http://www.youtube.com/watch?v=wylViAqNiRA

My links:

github.com/joshlong/the-spring-rest-stack

slideshare.net/joshlong/rest-apis-with-spring

@starbuxman

Page 62: Multi-Client Development with Spring

REST DESIGN WITH SPRING

Any

Questions?@starbuxman | [email protected] | http://slideshare.net/joshlong@royclarkson | [email protected] |http://www.slideshare.net/royclarkson

github.com/joshlong/the-spring-rest-stack