Как я могу запретить Ext JS включать тело объекта в запросы DELETE, используя хранилище restful? - PullRequest
6 голосов
/ 25 июня 2010

Когда Ext JS выдает запрос DELETE из хранилища отдыха, он включает тело объекта. Хотя это не представляется запрещенным спецификацией HTTP, Google App Engine не принимает такие запросы. Поэтому я хотел бы знать, есть ли способ предотвратить включение в хранилище Restful избыточного тела сущности в запросах DELETE.

Детали:

Используя этот образец в качестве справки: http://www.sencha.com/deploy/dev/examples/restful/restful.html

Вот как определяется магазин:

var store = new Ext.data.Store({
    id: 'user',
    restful: true,     // <-- This Store is RESTful
    proxy: proxy,
    reader: reader,
    writer: writer
});

После нажатия кнопки «Удалить» запрос Ext JS отправляет:

DELETE http://www.sencha.com/deploy/dev/examples/restful/app.php/users/6 HTTP/1.1
Host: www.sencha.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; pt-BR; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Type: application/json; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://www.sencha.com/deploy/dev/examples/restful/restful.html
Content-Length: 10
Cookie: bb_sessionhash=8d75f5e42d576fb695a02bf1d24c9ff1; etc...

{"data":6}

Когда запрос в этом формате (с контентом «data») передается в Google App Engine, он отвечает:

400 Bad Request

Ответы [ 2 ]

7 голосов
/ 07 июля 2010

Как вы уже догадались, эту проблему можно исправить, переопределив метод в классе HttpProxy.Сначала добавьте этот код:

// Special HttpProxy that sends no body on DELETE requests
Ext.data.GAEHttpProxy = Ext.extend(Ext.data.HttpProxy, {
doRequest: function(action, rs, params, reader, cb, scope, arg) {
    if(this.api[action]['method'].toLowerCase() == "delete") {
        delete params.jsonData;
    }

    Ext.data.GAEHttpProxy.superclass.doRequest.call(this, action, rs, params, reader, cb, scope, arg);
}
});

Затем используйте этот новый класс ("GAEHttpProxy") вместо HttpProxy в остальной части вашего кода (например, когда вы создаете прокси, который вы используете в своем магазине, показанномвыше).Это работает для меня, и я надеюсь, что это работает для вас!

0 голосов
/ 05 сентября 2017

Хотя вопрос задан 7 лет назад, а сейчас у нас Сенча 6, проблема еще не решена.Итак, вот мое рабочее решение:

Ext.define('My.Proxy', {
    extend: 'Ext.data.proxy.Rest',
    writer: {
        type: 'json',
        writeAllFields: true, // may be false, as you wish
        transform: {
            fn: function(data, request) {
                return request.config.action === 'destroy' ? null : data;
            },
            scope: this
        }
    }
});

Мы могли бы также выполнить эту проверку: request.config.method === 'DELETE', но по какой-то причине оно всегда возвращает false.Поэтому я рекомендую остаться с action === 'destroy'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...