2013-09-18 4 views
5

Я использую Grails с RESTful для разработки моего веб-приложения. Все работает нормально, пока я не обновляю свое приложение до Grails 2.3. Вот мои urlMappings: Я по-прежнему отправляю запрос, отправляю или делаю некоторые другие вещи в обычном режиме, но в запросах POST, PUT параметры отсутствуют. Сервер просто распознает только параметры, которые я помещаю прямо в URL, но остальное я заключу в форме или модели, когда submit не может быть найден в переменной params. Он мой UrlMappings:Отсутствующие параметры с запросом RESTful при обновлении до Grails 2.3.0

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? Спасибо огромное!

+0

Вы можете найти их в 'request' вместо' params'? – dmahapatro

+0

@ dmahapatro: Нет, я до сих пор их не вижу. Но если да, то почему этот параметр привязан к «запросу» вместо «params», как обычно? –

+1

Поскольку POST/PUT отправляет тело запроса, и в идеале нет необходимости в параметрах запроса. Но я не знаю, какова будет проблема в вашем случае, пока она не будет протестирована. – dmahapatro

ответ

8

Согласно этому http://grails.1312388.n4.nabble.com/Grails-2-3-and-parsing-json-td4649119.htmlparseRequest не имеет никакого эффекта начиная с Grails 2,3

Если вы используете JSON в теле запроса вы можете accees запрос Params в 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

Но что, если кто-то не использует JSON в качестве тела запроса? Почему логика синтаксического анализа не работает одинаково для всех методов? – cdeszaq

+0

Насколько я понимаю, ответ заключается в том, что все контроллеры и методы под «/ remote/**» используют JSON в качестве тела запроса. – Kipriz

+0

Мы нуждаемся в поддержке типов содержимого 'form-data' и' application/json' для нашего API, а более ранние версии grails (например, 2.2.x) позволяют легко обрабатывать все тела одинаково, позволяя все в объект 'param'. Возможно ли это? – cdeszaq

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 
} 
Смежные вопросы