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

118

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

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

При регистрации содержимого тела на стороне Java он буквально получает [object Object], поэтому как отправить данные REAL 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'
});
Теги:
xmlhttprequest

1 ответ

186
Лучший ответ

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

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

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

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

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


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

  • 0
    так мне больше не нужен processData: false с использованием JSON.stringify() ?
  • 4
    @brad - правильно, после этого это не будет иметь значения, потому что это уже строка, и в этом случае jQuery не будет обрабатывать ее дальше .
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню