Request params and PUT method
Solution 1
I had the exact same issue today and was able to fix it. I did an ajax request with JQuery to a Grails RESTful WebService (method: "PUT"), but the parameter map was empty.
Just want to share my solution here.
I had to JSON.stringify my data and set the contentType to "application/json" and then use request.JSON (as suggested before) in my Grails controller.
example (JQuery Ajax Request):
$.ajax({
url: "/entries/" + id,
contentType: "application/json",
type: "PUT",
dataType: "json",
data: JSON.stringify({'name' : name, 'date': date}),
success: function(msg) {
console.log('updated...')
$.mobile.changePage($('#list'));
}
afterwards I could use:
request.JSON
in my Controller in order to get the data sent by the ajax request (params was still empty). If I did not use JSON.stringify and set the content type, I had the following Grails error:
Error 2012-04-03 13:50:20,046 [http-bio-8080-exec-3] ERROR errors.GrailsExceptionResolver - IllegalStateException occurred when processing request: [PUT] /entries/2
getReader() has already been called for this request. Stacktrace follows:
Message: getReader() has already been called for this request
I'm using Grails 2.0.1 and JQuery 1.7.1
Solution 2
Try request.JSON (or request.XML) instead of params.
Igor Artamonov
Passionate software engineer % me: Follow http://twitter.com/splix Fork http://github.com/splix Network http://www.linkedin.com/in/igorartamonov email [email protected]
Updated on July 20, 2022Comments
-
Igor Artamonov almost 2 years
I'm trying to get request params passed by PUT request, at Grails-based app.
I'm using following client code to make request:
$.ajax({ url: 'api/controllerName/anId', type: 'PUT', data: $('form').serialize() })
with following mapping:
"/api/$controller/$id?" { action = [ GET: "read", POST: "create", PUT: "update", DELETE: "delete"] }
But my controller's action receives empty params list, with only id value. I tried to put it content to logs and saw only:
[id:anId, action:[GET:read, POST:create, PUT:update, DELETE:delete], controller:controllerName]
and
request.getParameterNames()
returns empty list of values.As I see from FireBug, request contains this params, and have Content-Type as
application/x-www-form-urlencoded; charset=UTF-8
If I'm using GET/POST method - everything is working as expected, I can get all passed parameters.
How I can get access to passed parameters?
Update: I've just figured that PUT implies passing data as JSON/XML in body. Btw, this question is still actual, just in case
-
Khon Lieu almost 12 yearsdude, @mburri you're awesome. i was having the exact same problem and it was bugging the heck out of me that i had to use POST for an update. the interesting thing is that "contentType: 'application/json'" on the client wasn't required when i did a PUT. request.JSON still contained the data. but when i did a POST, "contentType: 'application/json'" was required. but of course it's always best practice to state what you're sending. thanks a lot!
-
dbrin over 10 years+1 For PUT both contentType and stringify() must be used, thanks for the answer!
-
Teo Choong Ping over 10 yearsI'm wonder if this is a Jquery+grails issue because the grails side works fine when I tested with curl but not with jquery.