【问题标题】:jQuery's ajaxSetup - I would like to add default data for GET requests onlyjQuery 的 ajaxSetup - 我只想为 GET 请求添加默认数据
【发布时间】:2011-10-23 05:51:12
【问题描述】:

在一个 ajax 驱动的站点中,我使用 ajaxSetup 添加了一些默认数据,唉:

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

这是为了确保在部署新修订并且前端从后端请求 html 模板或 json-data 时缓存未命中。因此,后端和前端共享相同的修订号。

问题在于,当前端执行 PUT、POST 或 DELETE 时,后端对获取参数 'r' 有点不满意。有没有办法告诉 jQuery 的 ajax 这个数据应该只在执行 GET 请求时使用,而不是在执行 POST、PUT 或 DELETE 请求时使用。

更新:

我首先尝试了 beforeSend 功能,因为我知道它。但是更改 settings.data 是可能的,但是当 beforeSend 返回时,任何更改似乎都消失了。这可能是我的错... :-)

我已经选择了 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 }));
});

【问题讨论】:

标签: jquery ajax rest


【解决方案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 });
});

【讨论】:

  • 我用的是 jQuery 1.6.4,我只能让它像这样工作: options.data = $.param($.extend(originalOptions.data, { r: revision }));
  • @MorganCheng:检查您是否设置了正确的contentTypeprocessData 标志。 jQeury 会相应地进行序列化。如果您的数据是一个数组,您可能需要查看traditional 设置。
  • 最后一行有一个逗号。
  • jQuery 2.x 好像originalOptions.typeoptions.type 都是小写,比如options.type === 'post'
  • @WeizhongTu 违反规范:w3.org/Protocols/rfc2616/rfc2616-sec5.html
【解决方案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 documentation

BeforeSend documentation as well as your settings available

我编写了这个盲注,所以我希望它能让你朝着正确的方向前进。

【讨论】:

  • $.ajaxPrefilter 和 beforeSend 有什么区别?
  • @svlada $.ajaxSetup() - 为未来的 Ajax 请求设置默认值。 $.ajaxPrefilter() - 在发送每个请求之前修改现有选项。 stackoverflow.com/a/29843893/2714931
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 2017-02-01
  • 2018-07-11
  • 2012-06-16
相关资源
最近更新 更多