jQuery's ajaxSetup - I would like to add default data for GET requests only
Solution 1
Starting jQuery 1.5, you can handle this much more elegantly via 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 });
});
Solution 2
I think what you might be able to use is 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;
}
});
BeforeSend documentation as well as your settings available
I coded this blind, so I hope it gets you going in the right direction.
Related videos on Youtube
CodeReaper
I am born and breed in Denmark and am currently employed as a developer by a consulting company working out of Esbjerg.
Updated on June 04, 2022Comments
-
CodeReaper almost 2 years
In a ajax-driven site I have added some default data using the ajaxSetup, ala this:
var revision = '159'; $.ajaxSetup({ dataType: "text json", contentType: "application/x-www-form-urlencoded; charset=UTF-8", data: { r: revision } });
This is to ensure cache-miss when a new revision is deployed and the frontend ask for html templates or json-data from the backend. The backend and frontend share the same revision number for this reason.
The problem is that the backend it somewhat unhappy about getting the parameter 'r' when the frontend does a PUT, POST or DELETE. Is there no way to tell jQuery's ajax that this data should only be used when doing GET requests and not when doing POST, PUT or DELETE requests.
UPDATE:
I tried the beforeSend function first, since I knew it. However changing settings.data was possible, but any change seemed to vanish when beforeSend returned. It may have been my fault... :-)
I have settled on the ajaxPreFilter instead. It was not easy as pie though. The options.data is not an object, but the result of $.param(object), so the first challenge was to un-parameterize it. I ended up with this:
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 })); });
-
Morgan Cheng about 12 yearsI'm with jQuery 1.6.4, I can only make it work like this: options.data = $.param($.extend(originalOptions.data, { r: revision }));
-
Mrchief about 12 years@MorganCheng: Check if you're setting the right
contentType
andprocessData
flag. jQeury would do the serialization accordingly. If your data is an array, you might want to check outtraditional
setting. -
steve_c over 10 yearsYou have a trailing comma on your last line.
-
svlada about 9 yearsWhat is the difference between $.ajaxPrefilter and beforeSend?
-
WeizhongTu over 7 yearsjQuery 2.x seems
originalOptions.type
andoptions.type
are lower cases, such asoptions.type === 'post'
-
WeizhongTu over 7 years@svlada
$.ajaxSetup()
- Set default values for future Ajax requests.$.ajaxPrefilter()
- Modify existing options before each request is sent. stackoverflow.com/a/29843893/2714931 -
Mrchief over 7 years@WeizhongTu That'd be a violation of the spec: w3.org/Protocols/rfc2616/rfc2616-sec5.html