无正文的 HTTP DELETE 请求

HTTP DELETE request without body

我面临与上述相同的问题 here:我正在尝试将我的 ExtJS 4.1 存储与 REST API 连接,但是当我从存储中删除记录并因此调用 HTTP DELETE 时方法,它被服务器端拒绝,因为 ExtJS 发送的 HTTP 请求包含正文。不幸的是,上面 link 上接受的答案对 ExtJS 版本 4 及更高版本无效。

目前为止我做的最好的就是将空数组(字面意思是 [] )作为一个主体发送,但是当然这仍然被拒绝了:

这是我的代码:

Ext.define('TT.proxy.CustomRestProxy', { 
    alias: 'proxy.customrestproxy', 
    extend: 'Ext.data.proxy.Rest', 

    buildRequest: function(operation) {

        var request = this.callParent(arguments);

        if(operation.action === 'destroy')
        {                                
            delete request.operation.records;
        }
        return request; 
    }
});

defineStore = function(storeName, modelName, url) {
    var storeProperties = {
        extend: 'Ext.data.Store',
        requires: modelName,
        model: modelName,
        id: storeName,

        proxy: {
            type: 'customrestproxy',
            url: url,
            batchActions: false,
            noCache: false,
            headers: { 'Content-Type': 'application/json' },                
            reader: {
                type : 'json',
                totalProperty: 'total',
                successProperty: 'success',
                root: 'data'
            },
            writer: {
                type : 'json'
            },              
        }
    };

    Ext.define(storeName, storeProperties);
};

我会接受任何解决此问题的答案,它不必包含 ExtJS 特定的功能,即拦截 AJAX 请求或类似技术也是受欢迎的。

有一个基于 AJAX 拦截器的解决方法,灵感来自 this link。无论使用什么框架,这段代码都能解决问题,因此它对其他不一定使用 Ext JS 的人也很有用:

(function(XHR) {
    "use strict";

    var open = XHR.prototype.open;
    var send = XHR.prototype.send;
    var httpMethod;

    XHR.prototype.open = function(method, url, async, user, pass) {
        httpMethod = method;
        this._url = url;
        open.call(this, method, url, async, user, pass);
    };

    XHR.prototype.send = function(data) {
        if(httpMethod === 'DELETE')
        {
            data = null;            
        }        
        send.call(this, data);
    }
})(XMLHttpRequest);