DELETE, as its name suggests, is for deleting items and it is done by ID which means you don't need to send the entire object to the server via REST.
Operation | REST method | Sample URI |
---|---|---|
Return item(s) | GET | /books (all books) /books/ (all books) /books/12 (one book with ID = 12) |
Create a new item | POST | (you pass the ID in the object itself) /books /books/ |
Update an item | PUT | (you pass the ID in the object itself) /books /books/ |
Delete an item | DELETE | /books/12 (book with ID = 12) |
The Spring MVC controller part
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE) public void handleBookDelete(HttpServletResponse response, @PathVariable("id") Long bookId) throws IOException { BooksBean booksBean = Factory.getBooksBean(); try { booksBean.deleteBook(bookId); } catch (BookNotFoundException e) { response.sendError(HttpServletResponse.SC_NOT_FOUND); } }
This is a delete action - the RequestMapping method is DELETE, as you can see. When the book does not exist - we throw a 404, like we did in the previous example.
The Dojo part
function deleteBook(bookId) { var deferred = _request("xhrDelete", { url: "http://localhost:8080/restsample-0.0.1-SNAPSHOT/rest/books/" + bookId + ".json", handleAs: "json" }); deferred.addCallback(this, function(value) { alert("Book deleted."); }); deferred.addErrback(this, function(value) { alert("Error while deleting book: " + value); }); }
This is Dojo code - simple JavaScript very similar to what we did before. It uses the xhrDelete method, that's it.
Conclusion
This is the end of the series, for now. What else is there to possibly improve or cover?
- Error handling - something more automatic then writing to response with sendError.
- Validation - still an open bug at Spring JIRA.
- Your ideas?
Links
Download source code for this article
- REST with Spring 3.0, Spring MVC and Dojo. Part 1 - GET
- REST with Spring 3.0, Spring MVC and Dojo. Part 2 - GET from Dojo perspective
- REST with Spring 3.0, Spring MVC and Dojo. Part 3 - POST and JSR-303 validation
- REST with Spring 3.0, Spring MVC and Dojo. Part 4 - PUT (updating objects)
- REST with Spring 3.0, Spring MVC and Dojo. Part 5 - DELETE
Hi Michal,
ReplyDeleteSpring and REST are new for me. I was just wondering how I'd be able to managed incoming Form requests? I removed the MappingJacksonHttpMessageConverter and added FormHttpMessageConverter but it was still throwing me an error for the JSON Converter.
Your help would be appreciated.
Thanks,
Salman
Hey Salman,
ReplyDeleteI haven't tried that so I'm unable to give you any hints at the moment.
If you are able to provide the source code I might be able to take a look.
Best,
Michal
Hi Michal,
ReplyDeleteRemoving the @RequestBody annotation to receive the request from a jsp worked for me.
I just wanted to test my service using the browser but, now I am using the RestTemplate, so that helps.
I have ran into a couple of issues with the RestTemplate and JSON converter as well but, it won't be apt to ask questions related to that over here.
And apologies for not mentioning this earlier. Thanks a lot for putting this series of posts here. Much appreciated.
-Salman
Dear Salman,
ReplyDeleteI'm glad you managed to figure it out. There are some issues with @RequestBody and other annotations from Spring 3 MVC indeed, you might have stumbled upon one of them (a few are scattered around this series of articles).
One thing I wanted to say is that for testing REST you might want to try HTTP4E, it's really helpful. I think it's only available as an Eclipse plugin and there is a free of charge trial version.
Good luck,
Michal
Hi Michal,
ReplyDeleteThank you for your tutorial. I had some difficulties sending JSON data to my REST endpoint. I kept on receiving HTTP 415 errors when sending the data.
After I switched spring version to 3.0.5.RELEASE I found a clear error in my jetty console: One of my DTO's did not have a parameterless constructor. After fixing this I could send data without any problems.
Thanks!
Tim