2. Who Am I?
Java, Spring, and OSGi fanatic
Principal Consultant with Improving
Author
XDoclet in Action (Manning)
Spring in Action (Manning)
Modular Java (Pragmatic Bookshelf)
E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: @habuma Slides: http://www.slideshare.net/habuma
3. What REST is NOT!!!
Web Services
with URLs
E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma
4. It’s about Resources
Things, not actions
Requests, not demands
Resources, not services
Transfer of state, not RPC
E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma
5. The Pillars of REST
Resources
URIs/URLs
HTTP Methods
Representations
E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma
6. The Pillars of REST
Resources
Produced as model data in Spring MVC Controllers
URIs/URLs
Supported in handler methods by @PathParam
HTTP Methods
@RequestMapping, HiddenHttpMethodFilter, <form:form>
Representations
Rendered by view resolvers
HTML, XML, JSON, RSS, Atom, PDF, Excel, etc.
Negotiated by ContentNegotiatingViewResolver
E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma
8. Demanding URLs
Direct Imperative Resource identifier
Command is pushed into
a query parameter
http://www.somestore.com/displayProduct?sku=1234
Very service-y
Not very cacheable or
search engine friendly
E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma
9. Resourceful URLs
The focus is
on the product, We’re requesting
not the action a product’s info
http://www.somestore.com/product/1234
Cacheable This URL also
identifies a product
(within a context)
E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma
10. Spring MVC overview
E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma
17. HTTP Methods
GET, DELETE, PUT
Idempotent
Transfers state of resource
POST
Not Idempotent
Sends data (not nec. state)
E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma
18. PUT vs. POST
PUT
Used to transfer state to server
Useful when the resource’s URL is known
POST
Used to send data to server
Useful when the resource’s URL is unknown
or when transferring partial state
E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma
20. Handling PUT
@Controller
@RequestMapping("/product")
public class ProductController {
...
@RequestMapping(value="/{sku}", method=PUT)
public String saveProduct(
@PathVariable String sku,
Product product) {
// ... save product ...
return "redirect:/product/" + sku;
}
}
http://host/myApp/product/1234
E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma
21. Handling POST
@Controller
@RequestMapping("/product")
public class ProductController {
...
@RequestMapping(method=POST)
public String setPrice(String sku,
double price) {
// ... update price ...
return "redirect:/product/" + sku;
}
}
http://host/myApp/product
FORM DATA: sku=1234
price=5.99
E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma
22. Using PUT/DELETE in forms
Most browsers only support GET and POST
Spring’s <form:form> supports all
<form:form method="DELETE"
action="http://host/myApp/product/1234">
...
</form:form>
Hidden method field
<form method="POST"
action="http://host/myApp/product/1234">
<input type="hidden" name="_method"
value="DELETE">
...
</form>
E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma
26. Choosing a view
1. Determine the media type
URL path extension/mediaTypes
format parameter
URL path extension/JAF
HTTP Accept header
2. Find a view resolver that
serves that media type
E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma
33. RestTemplate
In Spring context: (or yes, it could just be new’d up in Java)
<bean id="restTemplate"
class="org.springframework.web.client.RestTemplate">
In Java:
RestTemplate rest = (RestTemplate) context.getBean("restTemplate");
Map result = rest.getForObject(
"http://localhost:8080/mugbooks/book/1.json", Map.class);
E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma
34. Summary
• Spring provides a flexible web MVC
framework
• Full support for REST as of Spring 3.0
• Can consume REST services via a template
E-mail: craig@habuma.com Blog: http://www.springinaction.com Twitter: habuma