我正在使用Grails和RESTful来开发我的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')
}
}
我已在http://grails.org/doc/latest/guide/theWebLayer.html#restfulMappings年阅读了Grails 2.3的最新文档 但我认为目前尚不清楚。我试过它按照文档但没有结果。并且没有任何关于使用Grails 2.3和RESTful的示例供我参考 如何使其像以前一样正常工作,并可以访问REST请求中的所有参数值?非常感谢你!
答案 0 :(得分:8)
根据此http://grails.1312388.n4.nabble.com/Grails-2-3-and-parsing-json-td4649119.html parseRequest
自Grails 2.3以来没有任何影响
如果您使用JSON作为请求正文,则可以将请求参数作为request.JSON.paramName
作为一种解决方法,您可以添加一个过滤器,将数据从JSON填充到params:
class ParseRequestFilters {
def filters = {
remoteCalls(uri: "/remote/**") {
before = {
if (request.JSON) {
log.debug("Populating parsed json to params")
params << request.JSON
}
}
}
}
}
答案 1 :(得分:0)
再加上Kipriz的答案和cdeszaq的评论,你可以编写一个递归方法来注入嵌套的params。这些方面的东西:
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
}