5

我正在使用带有 RESTful 的 Grails 来开发我的 Web 应用程序。一切正常,直到我将应用程序升级到 Grails 2.3。这是我的 UrlMappings:我仍然正常发送请求、提交或做一些其他事情,但是在 POST、PUT 请求中,缺少参数。服务器只识别我直接放在 URL 上的参数,但是在“params”变量中找不到提交时包含在表单或模型中的剩余部分。他是我的 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')
    }
}

我已经阅读了 Grails 2.3 的最新文档,位于http://grails.org/doc/latest/guide/theWebLayer.html#restfulMappings
但我认为还不清楚。我已经按照文档尝试过,但没有结果。并且没有任何关于将 Grails 2.3 与 RESTful 结合使用的示例供我参考。
如何让它像以前一样正常工作,并且可以访问 REST 请求中的所有参数值?非常感谢!

4

2 回答 2

8

根据这个http://grails.1312388.n4.nabble.com/Grails-2-3-and-parsing-json-td4649119.html parseRequest自 Grails 2.3 起无效

如果您使用 JSON 作为请求正文,您可以将请求参数作为request.JSON.paramName

作为一种解决方法,您可以添加一个过滤器,将数据从 JSON 填充到参数:

class ParseRequestFilters {

    def filters = {
        remoteCalls(uri: "/remote/**") {
            before = {
                if (request.JSON) {
                    log.debug("Populating parsed json to params")
                    params << request.JSON
                }
            }
        }
    }
}
于 2013-10-18T06:27:23.053 回答
0

添加到 Kipriz 的答案和 cdeszaq 的评论中,您可以编写一个递归方法来注入嵌套参数。这些方面的东西:

public void processNestedKeys(Map requestMap, String key) {
    if (getParameterValue(requestMap, key) instanceof JSONObject) {
        String nestedPrefix = key + ".";
        Map nestedMap = getParameterValue(requestMap, key)
        for (Map.Entry<String, Object> entry : nestedMap.entrySet()) {
            String newKey = nestedPrefix + entry.key;
            requestMap.put(newKey, getParameterValue(nestedMap, entry.key))
            processNestedKeys(requestMap, "${nestedPrefix + entry.key}");
        }
    }
}

public static Map populateParamsFromRequestJSON(def json) {
    Map requestParameters = json as ConcurrentHashMap
    for (Map.Entry<String, Object> entry : requestParameters.entrySet()) {
        processNestedKeys(requestParameters, entry.key)
    }

    return requestParameters
}
于 2014-03-05T19:33:34.247 回答