I would like to make my application somewhat REST compliant. I am using Rails on the backend and GWT on the frontend. I would like to do updates and deletes. I realize I can do something like mydomain.com/:id/delete (GET) and accomplish the same thing. However, as I stated previously, I would like to have a REST compliant backend. Thus, I want to do mydomain.com/:id (DELETE) and have it implicitly call my delete method.
Now, it's my understanding that if a browser (my browser is GWT RequestBuilder) doesn't support DELETE/GET, Rails somehow accomplishes this task with a POST and some other url parameter. So, how can I accomplish this with a GWT RequestBuilder?
Rails does this with hidden attributes. The easiest way to figure this out would be to create a new rails application, generate a scaffold and have a look at the HTML in a browser.
Try this:
Then navigate to http://localhost:3000/request_builders, click on New and have a look at the HTML. You'll see something like:
This is a creation, method is POST. Enter a name, save then Edit:
Of course the form is sent with POST, but Rails hads a hidden field to simulate a PUT request. Same for deletion, but the scaffold will do it with a bit of Javascript:
To have this work with another front-end, you'll have to both:
Like @skrat said, the
_method=PUT
workaround doesn't work for any kind of body whereContent-Type
is notx-www-form-urlencoded
, e.g. XML or JSON. Luckily, there is a header workaround as well:https://zcox.wordpress.com/2009/06/17/override-the-http-request-method-in-jersey/
So to update a REST resource, just do a POST to its address and add the header
X-HTTP-Method-Override: PUT
. Rails will interpret this as a PUT to the address.