JQuery публикует действительный JSON в теле запроса

180

Таким образом, в соответствии с документацией jQuery Ajax , при отправке запросов он сериализует данные в виде строки запроса, но настройка processData:falseдолжна позволять мне отправлять фактический JSON в теле. К сожалению, мне трудно сначала определить, происходит ли это, а во-вторых, как выглядит объект, который отправляется на сервер. Я знаю только то, что сервер не анализирует то, что я отправляю.

При использовании http-клиента для публикации литерала объекта {someKey:'someData'}это работает. Но при использовании JQuery с data: {someKey:'someData'}, это не удается. К сожалению, когда я анализирую запрос в Safari, он говорит, что полезная нагрузка сообщения [object Object]... велика ... а в Firefox сообщение пустое ...

При регистрации содержимого тела на стороне Java оно буквально получает, [object Object]так как можно отправить РЕАЛЬНЫЕ данные JSON ??

Кто-нибудь имел опыт работы с сервисом Java, сериализующим данные JSON в теле запроса, с запросом, отправленным из jQuery?

Кстати, вот полный запрос $ .ajax:

$.ajax({
    contentType: 'application/json',
    data: {
        "command": "on"
    },
    dataType: 'json',
    success: function(data){
        app.log("device control succeeded");
    },
    error: function(){
        app.log("Device control failed");
    },
    processData: false,
    type: 'POST',
    url: '/devices/{device_id}/control'
});
штифтик
источник

Ответы:

293

Фактический JSON-запрос будет выглядеть так:

data: '{"command":"on"}',

Куда вы отправляете фактическую строку JSON. Для более общего решения используйте JSON.stringify()сериализацию объекта в JSON, например, так:

data: JSON.stringify({ "command": "on" }),

Для поддержки старых браузеров, у которых нет JSONобъекта, используйте json2.js, который добавит его в.


В настоящее время происходит то processData: false, что у вас есть , это в основном отправка этого: ({"command":"on"}).toString()что [object Object]... вы видите в своем запросе.

Ник Крейвер
источник
так мне больше не нужен processData: false используя JSON.stringify()?
Брэд
6
@brad - правильно, после этого это не будет иметь значения, потому что это уже строка, и в этом случае jQuery не будет обрабатывать ее дальше .
Ник Крейвер
2
работал как шарм, большое спасибо! Правда ли, что все тела запросов должны быть строками, которые анализируются на другом конце?
Брэд
Почему jQuery анализирует dataстроку, а не просто отправляет ее как JSON?
Адам Зернер
Примечание: если кому-то нужно это в качестве «полезной нагрузки запроса тела» вместо данных формы, не забудьте включить, contentType: "application/json; charset=utf-8",как указано в этой теме: stackoverflow.com/questions/21201270/…
raydlevel5