没有正文的HTTP DELETE请求

时间:2015-10-15 16:06:52

标签: javascript extjs extjs4 http-delete

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

到目前为止,我取得的最好成绩是将空数组(字面意思,[])作为一个整体发送,但当然这仍然被拒绝:

enter image description here

这是我的代码:

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请求或类似技术。

1 个答案:

答案 0 :(得分:1)

基于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);