multi client development with spring for springone 2gx 2013 with roy clarkson
DESCRIPTION
Multi Client Development with Spring for SpringOne 2GX 2013 with Roy ClarksonTRANSCRIPT
![Page 1: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/1.jpg)
© 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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/2.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/3.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/4.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/5.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/6.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/7.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/8.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/9.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/10.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/11.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/12.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/13.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/14.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/15.jpg)
REST DESIGN WITH SPRINGREST 101
ACCEPTABLE406:NOT
![Page 16: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/16.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/17.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/18.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/19.jpg)
DemonstrationBasic RESTful service, REST shells
![Page 20: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/20.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/21.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/22.jpg)
DemonstrationSpring HATEOAS, Rest Shell
![Page 23: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/23.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/24.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/25.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/26.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/27.jpg)
DemonstrationSpring Data, Spring Data REST
![Page 28: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/28.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/29.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/30.jpg)
OAUTH
![Page 31: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/31.jpg)
OAUTH
![Page 32: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/32.jpg)
OAUTH
![Page 33: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/33.jpg)
DemonstrationSpring Security OAuth
![Page 34: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/34.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/35.jpg)
BINDINGS...
![Page 36: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/36.jpg)
...LOTS OF BINDINGS
![Page 37: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/37.jpg)
DemonstrationSpring Social
![Page 38: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/38.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/39.jpg)
SPRING ANDROID
Spring Android brings Spring core’s RestTemplate.
Spring Social and Spring HATEOAS work as well.
![Page 40: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/40.jpg)
SPRING ANDROID
More than 500,000 activations every day
More than 500,000 activations every day
![Page 41: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/41.jpg)
DemonstrationSpring Android-powered UI client
![Page 42: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/42.jpg)
USING REST AND OAUTH FROM IOS
![Page 43: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/43.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/44.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/45.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/46.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/47.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/48.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/49.jpg)
• HTTP Client– NSURLConnection
• JSON Processor (iOS 5)– NSJSONSerialization
• Data– NSData– NSDictionary– NSArray
49
![Page 50: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/50.jpg)
• Loading Data Synchronously
+ sendSynchronousRequest:returningResponse:error:
• Loading Data Asynchronously
+ sendAsynchronousRequest:queue:completionHandler:
50
![Page 51: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/51.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/52.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/53.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/54.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/55.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/56.jpg)
iOS Demo
![Page 57: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/57.jpg)
Q&A
![Page 58: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/58.jpg)
• Spring MVC Referencehttp://static.springsource.org/spring-framework/docs/current/spring-framework-reference/html/mvc.html
• URL Loading System Programming Guidehttp://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html
• Ben Hale’s presentation at SpringOne 2GXhttp://www.youtube.com/watch?v=wylViAqNiRA
58
![Page 59: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/59.jpg)
• Spring Roo Beginning Guidehttp://static.springsource.org/spring-roo/reference/html/beginning.html#beginning-step-1
59
![Page 60: Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/60.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/61.jpg)
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 for SpringOne 2GX 2013 with Roy Clarkson](https://reader033.vdocuments.site/reader033/viewer/2022052821/554a483ab4c9055a408b546d/html5/thumbnails/62.jpg)
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