HTTP-запрос DELETE без тела

Я столкнулся с той же проблемой, о которой упоминалось здесь: я пытаюсь подключить свое хранилище ExtJS 4.1 к REST API, но когда я удаляю запись из хранилища и, следовательно, вызываю метод HTTP DELETE, он отклоняется на стороне сервера, потому что HTTP-запрос, отправленный ExtJS, содержит тело. К сожалению, принятый ответ по приведенной выше ссылке недействителен для 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 или аналогичный метод.


person Miljen Mikic    schedule 15.10.2015    source источник
comment
Пожалуйста, не начинайте войну редактирования. Ознакомьтесь с политикой использования тегов в заголовках: stackoverflow.com/help/tagging   -  person Tarabass    schedule 15.10.2015


Ответы (1)


Существует обходной путь на основе перехватчика AJAX, вдохновленный этой ссылкой. Этот код решает проблему независимо от используемого фреймворка, поэтому он также может быть полезен другим людям, которые не обязательно используют 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);
person Miljen Mikic    schedule 17.10.2015