В 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 }));
});