Установка для свойства processData значения false в jQuery нарушает мой AJAX-запрос - PullRequest
16 голосов
/ 06 июня 2011

Я уже некоторое время гуглю и могу найти только то, что делает processData: false.Я не могу найти никого, кто сталкивался с такой же проблемой.

Я передаю JSON обратно на сервер и не хочу, чтобы jQuery автоматически преобразовывал данные в строку запроса, поэтому я устанавливаю для processData значение false,Я вижу, что запрос запускается, если я вынимаю processData, но как только я его вставляю, я не вижу никаких запросов (с использованием инструментов разработчика Firebug & Chrome).

$.ajax({
            url: myUrl,
            type: "POST",
            data: {foo: "bar"},
            processData: false,
            contentType: 'application/json'
        });

Запрос былПервоначально создание было немного более сложным, чем это, но я упростил его, чтобы попытаться сузить проблему, но этот простой кусок кода тоже не работает (опять же, он работает, если я закомментирую processData).Кроме того, я не вижу никаких ошибок JavaScript в консоли.

Редактировать

Для будущих веб-поисковиков: как указывал один день, jQuery не выдаст никаких ошибок, если вы предоставите либо объект JS, либонеправильно отформатированная строка JSON.Он просто не будет запускать запрос.

Ответы [ 3 ]

17 голосов
/ 06 июня 2011

Вы хотите передать данные в формате JSON.Вы передаете объект Javascript.JSON - это способ сериализации объектов Javascript в строки, чтобы их можно было передавать без проблем совместимости.

Вы действительно хотите передать JSON в строку:

$.ajax({
    url: myUrl,
    type: "POST",
    data: '{"foo": "bar"}',
    processData: false,
    contentType: 'application/json'
});
9 голосов
/ 03 октября 2016

На самом деле processData по умолчанию предполагает, что переданный data является объектом, и отправляет его как application/x-www-form-urlencoded.

Суммируя все сказанное выше @ lonesomeday и @ vsm для отправки необработанного JSON ( чем отличается от данных формы ) вам необходимо:

$.ajax({
    url: 'http://here-i.am/send-me/an/angel', // Determining far end
    data: JSON.stringify({foo: "bar"}), // Obtaining proper JSON string from data object
    processData: false, // Preventing default data parse behavior
    contentType: "application/json" // Setting proper `ContentType` for our data
    ...
});
0 голосов
/ 04 апреля 2019

Рисунок Я бы добавил свое текущее понимание (через несколько часов ..)

  • ProcessData = true: преобразовать пары значений имени объекта в кодировку URL или объекты массива в имяпары значений или взять строку как литерал.
  • ProcessData = false: взять строку как литерал или вызвать метод ToString () объекта.

ПоверхProcessData = true, установив «традиционный» флаг, он может отправить его, используя рекурсивное кодирование, которое захватывает сложные структуры, или список пар плоских значений имени.

Таким образом, в отношении OP он работал без указанияprocessData, поскольку по умолчанию установлено значение true.Таким образом, он преобразовал пары имя-значение в объекте в URLE-кодированную форму.Когда вы добавляете строку обратно, она вызывает метод toString () вашего объекта.Так как у вас нет строки в кодировке URL, возвращаемой методом toString () (у вас ее нет), вы получите строку, например «[object Object]».Возможно, jQuery не может отправлять строки, которые не закодированы в URL-адресе, или не использует унаследованный метод toString ().

Два представленных решения преобразуют объект в строку JSON, и, следовательно, нет обработки, и, следовательно,processData ничего не делает.Параметр contentType помогает серверу понять, что отправляется.

Кроме того, один человек прокомментировал, что обработка добавляет закодированные свойства к URL-адресу.Не совсем: отправляет эти данные наиболее подходящим способом;GET означает добавленный к URL-адресу, а POST означает HTTP-тело в кодировке Urlen.

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