Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Missing parameters with RESTful request when upgrading to Grails 2.3.0

Tags:

rest

grails

extjs

I am using Grails with RESTful to develop my web application. Everything works fine, till I upgrade my application to Grails 2.3. Here is my UrlMappings: I still send request, submit or do some other things normally, but in POST, PUT requests, the parameters are missing. Server just recognize only the parameters I put on the URL directly, but the remain I enclose in form or model when submit cannot be found in the "params" variable. He is my UrlMappings:

class UrlMappings {

    static mappings = {
        "/$controller/$action?/$id?"{ constraints {} }

        name apiSingle: "/api/$controller/$id"(parseRequest:true){
            action = [GET: "show", PUT: "update", DELETE: "delete"]
            constraints { id(matches:/\d+/) }
        }
        name apiCollection: "/api/$controller"(parseRequest:true){
            action = [GET: "list", POST: "save"]
        }

        name api2: "/api/$controller/$action"(parseRequest:true)
        name api3: "/api/$controller/$action/$id"(parseRequest:true)

        "/"(view:"/welcome")
        "500"(view:'/error')
    }
}

I have read the latest document of Grails 2.3, at http://grails.org/doc/latest/guide/theWebLayer.html#restfulMappings
but I think it is not clear. I have tried it follow the documentation but have no result. And there are no any sample about using Grails 2.3 with RESTful for me to refer.
How can I make it work normally as before, and can access all parameter values in REST request? Thank you so much!

like image 238
Đinh Hồng Châu Avatar asked Sep 18 '13 10:09

Đinh Hồng Châu


1 Answers

According to this http://grails.1312388.n4.nabble.com/Grails-2-3-and-parsing-json-td4649119.html parseRequest has no effect since Grails 2.3

If you use JSON as request body you can accees request params as request.JSON.paramName

As a workaround you can add a filter that will populate data from JSON to params:

class ParseRequestFilters {

    def filters = {
        remoteCalls(uri: "/remote/**") {
            before = {
                if (request.JSON) {
                    log.debug("Populating parsed json to params")
                    params << request.JSON
                }
            }
        }
    }
}
like image 197
Kipriz Avatar answered Sep 27 '22 19:09

Kipriz