Подтвердить что ты не робот

JQuery ajaxSetup - я хотел бы добавить данные по умолчанию только для запросов GET

В ajax-управляемом сайте я добавил некоторые данные по умолчанию, используя ajaxSetup, ala this:

var revision = '159';
$.ajaxSetup({
    dataType: "text json",
    contentType: "application/x-www-form-urlencoded; charset=UTF-8",
    data: {
        r: revision
    }
});

Это делается для обеспечения прошивки кеша при развертывании новой ревизии, а внешний интерфейс запрашивает html-шаблоны или json-данные из бэкэнд. По этой причине бэкэнд и интерфейс имеют одинаковый номер версии.

Проблема заключается в том, что бэкэнд несколько недовольны получением параметра "r", когда внешний интерфейс выполняет PUT, POST или DELETE. Невозможно сказать jQuery ajax, что эти данные следует использовать только при выполнении запросов GET, а не при выполнении запросов POST, PUT или DELETE.

UPDATE:

Сначала я попробовал функцию beforeSend, так как знал это. Однако изменение параметров settings.data было возможно, но любое изменение, казалось, исчезло, когда возвращалась функцияSend. Возможно, это была моя ошибка...: -)

Вместо этого я решил использовать ajaxPreFilter. Это было нелегко, как пирог. Параметры options.data не являются объектом, а результатом $.param(object), поэтому первой задачей было его не параметрирование. Я закончил с этим:

var revision = '159';
$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
    // do not send data for POST/PUT/DELETE
    if (originalOptions.type !== 'GET' || options.type !== 'GET') {
        return;
    }

    var data = originalOptions.data;
    if (originalOptions.data !== undefined) {
        if (Object.prototype.toString.call(originalOptions.data) === '[object String]') {
            data = $.deparam(originalOptions.data); // see http://benalman.com/code/projects/jquery-bbq/examples/deparam/
        }
    } else {
        data = {};
    }

    options.data = $.param($.extend(data, { r: revision }));
});
4b9b3361

Ответ 1

Начиная jQuery 1.5, вы можете обработать это гораздо более элегантно с помощью Prefilters:

var revision = '159';
$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
    // do not send data for POST/PUT/DELETE
    if(originalOptions.type !== 'GET' || options.type !== 'GET') {
        return;
    }

    options.data = $.extend(originalOptions.data, { r: revision });
});

Ответ 2

Я думаю, что вы можете использовать beforeSend.

var revision = '159';
$.ajaxSetup({
    dataType: "json",
    contentType: "application/x-www-form-urlencoded; charset=UTF-8",
    beforeSend: function(jqXHR, settings) {
        if(settings.type == "GET")
            settings.data = $.extend(settings.data, { ... });
        return true;
    }
});

Документация jqXHR

Документация BeforeSend, а также доступные настройки

Я закодировал это слепое, так что надеюсь, что вы пойдете в правильном направлении.