Request params and PUT method

10,953

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.

Share:
10,953
Igor Artamonov
Author by

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, 2022

Comments

  • Igor Artamonov
    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
    Khon Lieu almost 12 years
    dude, @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
    dbrin over 10 years
    +1 For PUT both contentType and stringify() must be used, thanks for the answer!
  • Teo Choong Ping
    Teo Choong Ping over 10 years
    I'm wonder if this is a Jquery+grails issue because the grails side works fine when I tested with curl but not with jquery.