jQuery's ajaxSetup - I would like to add default data for GET requests only

18,900

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

jqXHR documentation

BeforeSend documentation as well as your settings available

I coded this blind, so I hope it gets you going in the right direction.

Share:
18,900

Related videos on Youtube

CodeReaper
Author by

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, 2022

Comments

  • CodeReaper
    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
    Morgan Cheng about 12 years
    I'm with jQuery 1.6.4, I can only make it work like this: options.data = $.param($.extend(originalOptions.data, { r: revision }));
  • Mrchief
    Mrchief about 12 years
    @MorganCheng: Check if you're setting the right contentType and processData flag. jQeury would do the serialization accordingly. If your data is an array, you might want to check out traditional setting.
  • steve_c
    steve_c over 10 years
    You have a trailing comma on your last line.
  • svlada
    svlada about 9 years
    What is the difference between $.ajaxPrefilter and beforeSend?
  • WeizhongTu
    WeizhongTu over 7 years
    jQuery 2.x seems originalOptions.type and options.type are lower cases, such as options.type === 'post'
  • WeizhongTu
    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
    Mrchief over 7 years
    @WeizhongTu That'd be a violation of the spec: w3.org/Protocols/rfc2616/rfc2616-sec5.html