REST with Spring
    BJUG 6 @IBM

            Eugen Paraschiv
Overview
● Why REST?

● RESTful Constraints and Guidelines

● REST via Spring MVC

● Persistence with Spring Data

● Testing of a RESTful Service

● Q&A
Why REST
● REST is a set of Constraints (it's not the only
  one)
● Minimize Coupling between Client and
  Server
● Update the Server frequently without
  updating the Clients (no control over them)
● Support for many different types of Clients
● Scaling becomes easy(er)
The Four Levels of HTTP APIs - I, II
Level I. SOAP (Flickr SOAP API, Google AdSense API)
- WSDL describes the interface at design time
- no Resources are identified by URI - only Service Endpoints
- no difference between Resource and Representation
- HTTP treated as transport - no use of HTTP semantics


Level II. RPC (Amazon SimpleDB, Flickr 'REST' API)
+ the API exposes Resources (often corresponding to the application models)
- operations are done via actions in the URIs - the URI space is known at
design time (ex. /post/make_new)
- operations, failure codes are application specific
- HTTP treated as transport - no use of HTTP semantics
The Four Levels of HTTP APIs - III
Level III. HTTP (Twitter API)
+ Resources are exposed and identified by URIs
+ Resources are manipulated via Representations
+ HTTP semantics used correctly, use of generic media types (e.g.
application/xml)
- message semantics only known to Client and Server but not intermediaries -
Client and Server are coupled by original design
- application state machine is known at design time - assumptions about
available representations and transitions are hard-coded
The Four Levels of HTTP APIs - IV
Level IV. REST (Atom Pub, OpenSearch)
+ service description comes in the form of media type (and link relations)
specifications
+ Client only knows entry bookmark (the Root URI) and media types and no
specifics about the particular service
+ Client proceeds through application by looking at one response at a time,
each time evaluating how best to proceed given its overall goal and the
available transitions
+ Methods to use are known from media type (and link relations) specifications
or selected at runtime based on forms (form semantics known from media type
specifications)
REST SEC project
WHERE
- @github - https://github.com/eugenp/REST


WHY
- Reference Spring implementation of a REST Service
- Identity Management Solution as a Service


HOW
- REST/web: Spring 3.1.x
- Marshalling: Jackson 2.x (for JSON) and XStream (for XML)
- Persistence: Spring Data JPA and Hibernate 4.1.x
- Testing: Junit, Hamcrest, Mockito, rest-assured, RestTemplate (Apache
HTTP Client)
RESTful Constraints - I. Stateless
"Each request from client to server must contain all of the information
necessary to understand the request, and cannot take advantage of any stored
context on the server. Session state is therefore kept entirely on the client"



In Short
- no sessions, no cookies
- each request should contain it's authentication credentials

With Spring Security
<http create-session="stateless" ... >
RESTful Constraints - II. Cache
● Caching is on the Client side
● Goal of Client side Caching - partially or
  completely eliminate interactions with the
  Server
● HTTP Caching options:
  ● ETag/If-None-Match
  ● Last-Modified/If-Modified-Since
III. Caching - ETag - example
- ex: first, retrieve a Privilege resource:

curl -H "Accept: application/json" -i http://localhost:
8080/rest-sec/api/privileges/1

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Link: <http://localhost:8080/rest-sec/api/privileges>;
rel="collection"
ETag: "f88dd058fe004909615a64f01be66a7"
Last-Modified: Fri, 05 Oct 2012 11:36:33 GMT
Content-Type: application/json;charset=UTF-8
Content-Length: 52
Date: Fri, 05 Oct 2012 11:36:33 GMT
III. Caching - ETags - example (cont)
- next, use the etag value from the previous response to
retrieve the Privilege resource again:
curl -H "Accept: application/json" -H 'If-None-Match:
"f88dd058fe004909615a64f01be66a7"' -i http://localhost:
8080/rest-sec/api/privileges/1

HTTP/1.1 304 Not Modified
Server: Apache-Coyote/1.1
Link: <http://localhost:8080/rest-sec/api/privileges>;
rel="collection"
ETag: "f88dd058fe004909615a64f01be66a7"
Date: Fri, 05 Oct 2012 11:37:55 GMT
REST Constraint - III. Uniform
Interface
Uniform Interface Constraints
1. Identification of Resources
2. Manipulation of Resources through Representations
3. Self-descriptive Messages
4. Hypermedia As The Engine Of Application State
(HATEOAS)
III.1. Identification of Resources -
Spring MVC
For a sample foo resource:
- the Controller
@Controller
@RequestMapping(value = "foos")
public class FooController{ ... }



- retrieve by id: GET api/foos/id
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Foo findOne(@PathVariable("id") Long id){...}



- search: GET api/foos?q=query
@RequestMapping(params = {"q"}, method = RequestMethod.GET)
public List<Foo> search(@RequestParam("q") String query){...}
III.1. Identification of Resources -
Spring MVC (cont)
- create single (update the collection): POST api/foos
@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public void create(@RequestBody Foo resource) {...}



- update/override PUT api/foos/id
@RequestMapping(method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.OK)
public void update(@RequestBody Foo resource) { ... }



- delete: DELETE api/foos/id
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
@ResponseStatus(HttpStatus.NO_CONTENT)
public void delete(@PathVariable("id") Long id) { ... }
REST Constraint - III. Uniform
Interface
Supported Representations:
- JSON - application/json
- XML - application/xml
- future: ATOM

All read operations will perform Content
Negotiation when the Accept header is set on
the request
All write operations supports the Content-Type
header to be set on the request
Spring MVC - the Controller/Web
Layer
Simple Responsibilities:
- mapping of URIs
- Marshalling/Unmarshalling of Resource
Representations (implicit)
- Translation of Exceptions to HTTP Status
Codes
REST Constraint - III. Uniform
Interface - HATEOAS
- Discoverability at the root
- the Create operation
- making use of `rel`
- Advanced Topics: custom Mime Types, HAL
Persistence Layer - Spring Data
- DAO only with interfaces - no implementations
public interface IUserJpaDAO extends JpaRepository<User,
Long> { … }


- define a new, simple method:
List<User> findByLastname(String lastname);
List<User> findByEmailAddressAndLastname(String
emailAddress, String lastname);


- flexibility to use @Query
@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);
Persistence Layer - Spring Data

● Pagination
Page<User> findByFirstname(String firstname, Pageable
pageable);



● Sorting
List<User> findByLastname(String lastname, Sort sort);
Persistence Layer - Spring Data
Other out of the box features - support for:
● Audit: create date, created by, last update date, last
   updated by
● Advanced Persistence APIs: QueryDSL,
   JPA 2 Specifications
Transactional Semantics
- the API Layer Strategy
● the Controller layer is the transactional
    owner
● the Service layer contains no transactional
    semantics
● there are no self-invocations or inter-
    invocations in the Controller layer - each
    invocation is a client call
Testing of a REST Service
● Live Tests: testing the deployed RESTful
    service
    ○ each RESTful service has a corresponding
        production API and a testing API
    ○ high level testing is done via the production API
    ○ lower level testing is done via the testing API
●   Integration tests: business, persistence

●   Unit tests
Testing - High Level Live Test (over
REST)
@Test
public void
givenResourceExists_whenResourceIsRetrievedByName_thenResourceIsFound() {
    // Given
    T existingResource = api.create(createNewEntity());

    // When
    T resourceByName = api.findByName(existingResource.getName());

    // Then
    assertNotNull(resourceByName);
}
Testing - Low Level Live Test (over
REST)
@Test
public void
givenInvalidResource_whenResourceIsUpdated_then409ConflictIsReceived() {
    // Given
    User existingUser = RestAssured.given().auth().preemptive().basic
(username, password).contentType("application/json").body(resourceAsJson).
post(uri).as(User.class);
    existingUser.setName(null);

    // When
    Response updateResponse = RestAssured.given().auth().preemptive().
basic(username, password).contentType("application/json").body
(existingUser).put(uri);

    // Then
    assertThat(updateResponse.getStatusCode(), is(409));
}
Security Concerns
- Basic and Digest Authentication with Spring
Security ON THE SAME URI (similar to
Content Negotiation):
● Authorization: Basic ...
● Authorization: Digest ...
Conclusion
Questions:
-?
-?
-?
-?
THANKS

More Related Content

PDF
Building RESTful applications using Spring MVC
PDF
Microservices with Spring Boot
PDF
Spring Mvc Rest
PDF
Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson
PDF
Effective Web Application Development with Apache Sling
PDF
REST APIs with Spring
PPTX
Microservices/dropwizard
PDF
Apache Sling as an OSGi-powered REST middleware
Building RESTful applications using Spring MVC
Microservices with Spring Boot
Spring Mvc Rest
Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson
Effective Web Application Development with Apache Sling
REST APIs with Spring
Microservices/dropwizard
Apache Sling as an OSGi-powered REST middleware

What's hot (19)

PDF
Dropwizard Spring - the perfect Java REST server stack
KEY
Multi Client Development with Spring
PPTX
Spring boot Introduction
PDF
Building Beautiful REST APIs with ASP.NET Core
PDF
Introduction to Spring Boot
PPTX
Android and REST
PPTX
The Past Year in Spring for Apache Geode
PDF
JavaCro'14 - Building interactive web applications with Vaadin – Peter Lehto
PPTX
REST Easy with AngularJS - ng-grid CRUD EXAMPLE
PPTX
Spring Boot & WebSocket
PDF
Spring 4 Web App
PPTX
Best Practices for Architecting a Pragmatic Web API.
PPTX
Spring Boot
PPTX
Content-centric architectures - case study : Apache Sling
PDF
The never-ending REST API design debate
PDF
Lecture 7 Web Services JAX-WS & JAX-RS
PPT
Using Java to implement SOAP Web Services: JAX-WS
PDF
Angularjs & REST
PDF
WSO2Con Asia 2014 - WSO2 AppDev Platform for the Connected Business
Dropwizard Spring - the perfect Java REST server stack
Multi Client Development with Spring
Spring boot Introduction
Building Beautiful REST APIs with ASP.NET Core
Introduction to Spring Boot
Android and REST
The Past Year in Spring for Apache Geode
JavaCro'14 - Building interactive web applications with Vaadin – Peter Lehto
REST Easy with AngularJS - ng-grid CRUD EXAMPLE
Spring Boot & WebSocket
Spring 4 Web App
Best Practices for Architecting a Pragmatic Web API.
Spring Boot
Content-centric architectures - case study : Apache Sling
The never-ending REST API design debate
Lecture 7 Web Services JAX-WS & JAX-RS
Using Java to implement SOAP Web Services: JAX-WS
Angularjs & REST
WSO2Con Asia 2014 - WSO2 AppDev Platform for the Connected Business
Ad

Similar to Rest with Spring (20)

PDF
20 Most Asked Question on Rest APIs .pdf
PPTX
ASP.NET Mvc 4 web api
PPT
APITalkMeetupSharable
PDF
Networked APIs with swift
PDF
PPTX
Service approach for development Rest API in Symfony2
PPTX
REST API Best Practices & Implementing in Codeigniter
PDF
Xamarin Workshop Noob to Master – Week 5
PPSX
Restful web services rule financial
PDF
RESTful API-centric Universe
PPT
nguyenhainhathuy-building-restful-web-service
PPTX
Apitesting.pptx
PPTX
ASP.NET WEB API Training
PPTX
Design Summit - RESTful API Overview - John Hardy
ODP
Embrace HTTP with ASP.NET Web API
PPTX
Best Practices in Api Design
PDF
Rest api titouan benoit
PPTX
Apex REST
PPTX
PPTX
Cloud Side: REST APIs - Best practices
20 Most Asked Question on Rest APIs .pdf
ASP.NET Mvc 4 web api
APITalkMeetupSharable
Networked APIs with swift
Service approach for development Rest API in Symfony2
REST API Best Practices & Implementing in Codeigniter
Xamarin Workshop Noob to Master – Week 5
Restful web services rule financial
RESTful API-centric Universe
nguyenhainhathuy-building-restful-web-service
Apitesting.pptx
ASP.NET WEB API Training
Design Summit - RESTful API Overview - John Hardy
Embrace HTTP with ASP.NET Web API
Best Practices in Api Design
Rest api titouan benoit
Apex REST
Cloud Side: REST APIs - Best practices
Ad

Recently uploaded (20)

PDF
ENT215_Completing-a-large-scale-migration-and-modernization-with-AWS.pdf
PDF
Zenith AI: Advanced Artificial Intelligence
PDF
Developing a website for English-speaking practice to English as a foreign la...
PDF
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
PDF
Unlock new opportunities with location data.pdf
PDF
Taming the Chaos: How to Turn Unstructured Data into Decisions
DOCX
search engine optimization ppt fir known well about this
PDF
A contest of sentiment analysis: k-nearest neighbor versus neural network
PDF
A review of recent deep learning applications in wood surface defect identifi...
PPTX
Final SEM Unit 1 for mit wpu at pune .pptx
PPTX
observCloud-Native Containerability and monitoring.pptx
PPT
Module 1.ppt Iot fundamentals and Architecture
PDF
Getting Started with Data Integration: FME Form 101
PDF
August Patch Tuesday
PDF
DP Operators-handbook-extract for the Mautical Institute
PDF
Univ-Connecticut-ChatGPT-Presentaion.pdf
PDF
DASA ADMISSION 2024_FirstRound_FirstRank_LastRank.pdf
PDF
A novel scalable deep ensemble learning framework for big data classification...
PPTX
The various Industrial Revolutions .pptx
PPTX
MicrosoftCybserSecurityReferenceArchitecture-April-2025.pptx
ENT215_Completing-a-large-scale-migration-and-modernization-with-AWS.pdf
Zenith AI: Advanced Artificial Intelligence
Developing a website for English-speaking practice to English as a foreign la...
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
Unlock new opportunities with location data.pdf
Taming the Chaos: How to Turn Unstructured Data into Decisions
search engine optimization ppt fir known well about this
A contest of sentiment analysis: k-nearest neighbor versus neural network
A review of recent deep learning applications in wood surface defect identifi...
Final SEM Unit 1 for mit wpu at pune .pptx
observCloud-Native Containerability and monitoring.pptx
Module 1.ppt Iot fundamentals and Architecture
Getting Started with Data Integration: FME Form 101
August Patch Tuesday
DP Operators-handbook-extract for the Mautical Institute
Univ-Connecticut-ChatGPT-Presentaion.pdf
DASA ADMISSION 2024_FirstRound_FirstRank_LastRank.pdf
A novel scalable deep ensemble learning framework for big data classification...
The various Industrial Revolutions .pptx
MicrosoftCybserSecurityReferenceArchitecture-April-2025.pptx

Rest with Spring

  • 1. REST with Spring BJUG 6 @IBM Eugen Paraschiv
  • 2. Overview ● Why REST? ● RESTful Constraints and Guidelines ● REST via Spring MVC ● Persistence with Spring Data ● Testing of a RESTful Service ● Q&A
  • 3. Why REST ● REST is a set of Constraints (it's not the only one) ● Minimize Coupling between Client and Server ● Update the Server frequently without updating the Clients (no control over them) ● Support for many different types of Clients ● Scaling becomes easy(er)
  • 4. The Four Levels of HTTP APIs - I, II Level I. SOAP (Flickr SOAP API, Google AdSense API) - WSDL describes the interface at design time - no Resources are identified by URI - only Service Endpoints - no difference between Resource and Representation - HTTP treated as transport - no use of HTTP semantics Level II. RPC (Amazon SimpleDB, Flickr 'REST' API) + the API exposes Resources (often corresponding to the application models) - operations are done via actions in the URIs - the URI space is known at design time (ex. /post/make_new) - operations, failure codes are application specific - HTTP treated as transport - no use of HTTP semantics
  • 5. The Four Levels of HTTP APIs - III Level III. HTTP (Twitter API) + Resources are exposed and identified by URIs + Resources are manipulated via Representations + HTTP semantics used correctly, use of generic media types (e.g. application/xml) - message semantics only known to Client and Server but not intermediaries - Client and Server are coupled by original design - application state machine is known at design time - assumptions about available representations and transitions are hard-coded
  • 6. The Four Levels of HTTP APIs - IV Level IV. REST (Atom Pub, OpenSearch) + service description comes in the form of media type (and link relations) specifications + Client only knows entry bookmark (the Root URI) and media types and no specifics about the particular service + Client proceeds through application by looking at one response at a time, each time evaluating how best to proceed given its overall goal and the available transitions + Methods to use are known from media type (and link relations) specifications or selected at runtime based on forms (form semantics known from media type specifications)
  • 7. REST SEC project WHERE - @github - https://github.com/eugenp/REST WHY - Reference Spring implementation of a REST Service - Identity Management Solution as a Service HOW - REST/web: Spring 3.1.x - Marshalling: Jackson 2.x (for JSON) and XStream (for XML) - Persistence: Spring Data JPA and Hibernate 4.1.x - Testing: Junit, Hamcrest, Mockito, rest-assured, RestTemplate (Apache HTTP Client)
  • 8. RESTful Constraints - I. Stateless "Each request from client to server must contain all of the information necessary to understand the request, and cannot take advantage of any stored context on the server. Session state is therefore kept entirely on the client" In Short - no sessions, no cookies - each request should contain it's authentication credentials With Spring Security <http create-session="stateless" ... >
  • 9. RESTful Constraints - II. Cache ● Caching is on the Client side ● Goal of Client side Caching - partially or completely eliminate interactions with the Server ● HTTP Caching options: ● ETag/If-None-Match ● Last-Modified/If-Modified-Since
  • 10. III. Caching - ETag - example - ex: first, retrieve a Privilege resource: curl -H "Accept: application/json" -i http://localhost: 8080/rest-sec/api/privileges/1 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Link: <http://localhost:8080/rest-sec/api/privileges>; rel="collection" ETag: "f88dd058fe004909615a64f01be66a7" Last-Modified: Fri, 05 Oct 2012 11:36:33 GMT Content-Type: application/json;charset=UTF-8 Content-Length: 52 Date: Fri, 05 Oct 2012 11:36:33 GMT
  • 11. III. Caching - ETags - example (cont) - next, use the etag value from the previous response to retrieve the Privilege resource again: curl -H "Accept: application/json" -H 'If-None-Match: "f88dd058fe004909615a64f01be66a7"' -i http://localhost: 8080/rest-sec/api/privileges/1 HTTP/1.1 304 Not Modified Server: Apache-Coyote/1.1 Link: <http://localhost:8080/rest-sec/api/privileges>; rel="collection" ETag: "f88dd058fe004909615a64f01be66a7" Date: Fri, 05 Oct 2012 11:37:55 GMT
  • 12. REST Constraint - III. Uniform Interface Uniform Interface Constraints 1. Identification of Resources 2. Manipulation of Resources through Representations 3. Self-descriptive Messages 4. Hypermedia As The Engine Of Application State (HATEOAS)
  • 13. III.1. Identification of Resources - Spring MVC For a sample foo resource: - the Controller @Controller @RequestMapping(value = "foos") public class FooController{ ... } - retrieve by id: GET api/foos/id @RequestMapping(value = "/{id}", method = RequestMethod.GET) public Foo findOne(@PathVariable("id") Long id){...} - search: GET api/foos?q=query @RequestMapping(params = {"q"}, method = RequestMethod.GET) public List<Foo> search(@RequestParam("q") String query){...}
  • 14. III.1. Identification of Resources - Spring MVC (cont) - create single (update the collection): POST api/foos @RequestMapping(method = RequestMethod.POST) @ResponseStatus(HttpStatus.CREATED) public void create(@RequestBody Foo resource) {...} - update/override PUT api/foos/id @RequestMapping(method = RequestMethod.PUT) @ResponseStatus(HttpStatus.OK) public void update(@RequestBody Foo resource) { ... } - delete: DELETE api/foos/id @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) @ResponseStatus(HttpStatus.NO_CONTENT) public void delete(@PathVariable("id") Long id) { ... }
  • 15. REST Constraint - III. Uniform Interface Supported Representations: - JSON - application/json - XML - application/xml - future: ATOM All read operations will perform Content Negotiation when the Accept header is set on the request All write operations supports the Content-Type header to be set on the request
  • 16. Spring MVC - the Controller/Web Layer Simple Responsibilities: - mapping of URIs - Marshalling/Unmarshalling of Resource Representations (implicit) - Translation of Exceptions to HTTP Status Codes
  • 17. REST Constraint - III. Uniform Interface - HATEOAS - Discoverability at the root - the Create operation - making use of `rel` - Advanced Topics: custom Mime Types, HAL
  • 18. Persistence Layer - Spring Data - DAO only with interfaces - no implementations public interface IUserJpaDAO extends JpaRepository<User, Long> { … } - define a new, simple method: List<User> findByLastname(String lastname); List<User> findByEmailAddressAndLastname(String emailAddress, String lastname); - flexibility to use @Query @Query("select u from User u where u.emailAddress = ?1") User findByEmailAddress(String emailAddress);
  • 19. Persistence Layer - Spring Data ● Pagination Page<User> findByFirstname(String firstname, Pageable pageable); ● Sorting List<User> findByLastname(String lastname, Sort sort);
  • 20. Persistence Layer - Spring Data Other out of the box features - support for: ● Audit: create date, created by, last update date, last updated by ● Advanced Persistence APIs: QueryDSL, JPA 2 Specifications
  • 21. Transactional Semantics - the API Layer Strategy ● the Controller layer is the transactional owner ● the Service layer contains no transactional semantics ● there are no self-invocations or inter- invocations in the Controller layer - each invocation is a client call
  • 22. Testing of a REST Service ● Live Tests: testing the deployed RESTful service ○ each RESTful service has a corresponding production API and a testing API ○ high level testing is done via the production API ○ lower level testing is done via the testing API ● Integration tests: business, persistence ● Unit tests
  • 23. Testing - High Level Live Test (over REST) @Test public void givenResourceExists_whenResourceIsRetrievedByName_thenResourceIsFound() { // Given T existingResource = api.create(createNewEntity()); // When T resourceByName = api.findByName(existingResource.getName()); // Then assertNotNull(resourceByName); }
  • 24. Testing - Low Level Live Test (over REST) @Test public void givenInvalidResource_whenResourceIsUpdated_then409ConflictIsReceived() { // Given User existingUser = RestAssured.given().auth().preemptive().basic (username, password).contentType("application/json").body(resourceAsJson). post(uri).as(User.class); existingUser.setName(null); // When Response updateResponse = RestAssured.given().auth().preemptive(). basic(username, password).contentType("application/json").body (existingUser).put(uri); // Then assertThat(updateResponse.getStatusCode(), is(409)); }
  • 25. Security Concerns - Basic and Digest Authentication with Spring Security ON THE SAME URI (similar to Content Negotiation): ● Authorization: Basic ... ● Authorization: Digest ...