AJAX публикует данные JSON из Javascript в Grails - PullRequest
3 голосов
/ 02 января 2011

Я пытаюсь отправить данные в формате JSON из Javascript (используя Prototype) в Grails. Мой код Javascript:

var JSONObject = new Object;
    JSONObject.id = "23";
    JSONObject.name = "Test 1";
    JSONstring = JSON.stringify(JSONObject);



 var url = "${createLink(controller:'testController', action:'receiveJson')}";
    new Ajax.Request(url, {
      method:'post',
      contentType:'application/json',
      parameters:JSONstring,
      asynchronous:true,
      onSuccess: function (req) {
        sendInfoResponse(req.responseText);
      }
    });

и код в моем контроллере Grails:

def receiveJson = {
  def json = request.JSON;
}

Однако в моих тестах переменная 'json' кажется пустой. Я был бы так благодарен, если бы кто-то мог объяснить, что я делаю неправильно. Большое спасибо.

Ответы [ 3 ]

5 голосов
/ 02 января 2011

В вашем Ajax.Request опции меняются

parameters:JSONstring,

до

postBody:JSONstring,

Проблема с использованием параметров заключается в том, что URL-адрес кодирует данные, поэтому тело запроса в итоге выглядит следующим образом:

%7B%22id%22%3A%2223%22%2C%22name%22%3A%22Test%201%22%7D&_=

Вместо желаемого (что вы получаете с postBody):

{"id":"23","name":"Test 1"}
1 голос
/ 02 января 2011

Хороший вопрос mfloryan - я проводил тестирование вручную, то есть не как часть модульного или интеграционного теста.

Большое спасибо за помощь hvgotcodes ,Я внес изменения в свой код, как вы предложили, но, к сожалению, безрезультатно.Интересно, что если я печатаю request.JSON, я получаю {}, тогда как, если я печатаю request.json, я получаю null.

EDIT: под «печатью» я имею в виду:

РЕДАКТИРОВАТЬ: Большое спасибо всем за помощь.Как только я сделал последнее изменение, Джон Вагенляйт предложил, что код начал работать должным образом.Я очень благодарен за вашу помощь.

0 голосов
/ 02 января 2011

Не думаю, что вы правильно вызываете Ajax.Request. Из документации, параметр параметров:

"Параметры для запроса, который будет закодирован в URL для метода get или в тело запроса для других методов. Это может быть предоставлено либо в виде строки в кодировке URL, либо в виде любого Hash совместимый объект (в основном что-нибудь) со свойствами, представляющими параметры. "

Я думаю, тебе нужно сделать что-то вроде

...
parameters: {json: JSONString}
...

и затем в вашем контроллере

request.json

обратите внимание на форму литерала объекта параметров - он сообщает библиотеке Prototype, что ключ запроса должен быть json, а значение запроса - строкой json. Вы получаете доступ к ключу объекта запроса в контроллере.

РЕДАКТИРОВАТЬ - Я только что понял, что ваш блок javascript поднят.

Это:

var JSONObject = new Object;

должно быть что-то вроде

var JSONObject = new Object();
...

Вы также можете использовать только литерал объекта, поэтому

var jsonObject = {};
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...