Spring REST Concepts: Difference between revisions
No edit summary |
|||
Line 32: | Line 32: | ||
===Request Headers=== | ===Request Headers=== | ||
===Request Body=== | ===Request Body=== | ||
====Request Body and Jackson Deserialization==== | |||
If the request body is encoded as "application/json", and it is declared as: | |||
<syntaxhighlight lang='java'> | |||
</syntaxhighlight> | |||
Spring handles it transparently, it deserializes JSON and instantiates the Java object representing the body. | |||
===Form Parameters=== | ===Form Parameters=== | ||
Revision as of 15:56, 27 March 2019
Internal
Overview
The. Spring REST concepts page is an extension of the Spring MVC Concepts page. Spring MVC concepts are used and extended to provide REST support.
Playground
Annotations
Receive Data from Client
TODO: REST and Hypermedia
Via Path
Query Parameters
Path Parameters
Via Request
Request Headers
Request Body
Request Body and Jackson Deserialization
If the request body is encoded as "application/json", and it is declared as:
Spring handles it transparently, it deserializes JSON and instantiates the Java object representing the body.
Form Parameters
Read a Resource Representation
Read REST resources by annotating handlers of a @RestController with @RequestMapping and @GetMapping.
Create a Resource
Create a REST resource by annotating handlers of a @RestController with @RequestMapping, @PostMapping. POST is not safe and not idempotent.
Update a Resource
Update a REST resource by annotating handlers of a @RestController with @RequestMapping, @PutMapping or @PatchMapping. PUT is idempotent.
Delete a Resource
Delete a REST resource by annotating handlers of a @RestController with @DeleteMapping.
Send a Response to Client
The @RestController annotation implies @ResponseBody, which maps the result produced by the handler method onto the body of the HTTP response.
By default, if all goes well - no exceptions are thrown - the HTTP status code is 200, even if the method returns null.
If the method handler wants to control the HTTP status code, it has the option of wrapping the response in a ResponseEntity<>, which, along the body, allows specifying the response code:
import org.springframework.http.ResponseEntity;
...
public ResponseEntity<A> get(...) {
// if found ...
return new ResponseEntity<>(a, HttpStatus.OK);
// ... else
return new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
}
Another way of statically enforcing a response code is with @ResponseStatus.
It is always a good idea to send a specific response code, instead of 200, where appropriate to communicate the most descriptive and accurate HTTP status to the client.
REST Clients
RestTemplate
TO PROCESS: https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#webmvc-resttemplate
POSTing Resource. Data
This overloaded version allows you to receive the newly created resource as a domain model object:
RestTemplate restTemplate = new RestTemplate();
MyResource model = new MyResource(...);
MyResource created = restTemplate.postForObject("http://localhost:8080/myresource", model, MyResource.class);