Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止ExtJS在使用restful存储的删除请求中包含实体体?_Rest_Extjs - Fatal编程技术网

如何防止ExtJS在使用restful存储的删除请求中包含实体体?

如何防止ExtJS在使用restful存储的删除请求中包含实体体?,rest,extjs,Rest,Extjs,当ExtJS从restful存储发出删除请求时,它包含一个实体体。虽然这是HTTP规范规定的,但Google应用程序引擎不接受此类请求。因此,我想知道是否有办法防止restful存储在删除请求中包含冗余实体体 详细信息: 使用此示例作为参考: 这是存储的定义方式: var store = new Ext.data.Store({ id: 'user', restful: true, // <-- This Store is RESTful proxy: p

当ExtJS从restful存储发出删除请求时,它包含一个实体体。虽然这是HTTP规范规定的,但Google应用程序引擎不接受此类请求。因此,我想知道是否有办法防止restful存储在删除请求中包含冗余实体体

详细信息:

使用此示例作为参考:

这是存储的定义方式:

var store = new Ext.data.Store({
    id: 'user',
    restful: true,     // <-- This Store is RESTful
    proxy: proxy,
    reader: reader,
    writer: writer
});
当此格式的请求(包含“数据”内容)提交到Google App Engine时,它会以以下方式回复:

400 Bad Request

正如您所猜测的,您可以通过重写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(例如,当您在上面显示的存储中创建代理时)。这对我有用,我希望对你有用

虽然这个问题是7年前提出来的,现在我们有了sencha 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'

Awesome,这确实有效。我在appengine上测试了它。非常感谢,您不仅发布了解决问题的干净代码,还演示了如何自定义代理。干得好。这似乎不适用于ExtJS4。doRequest现在有
操作、回调、作用域
参数。@CoderDennis也无法将此答案应用于Ext JS 4,因此将其作为一个单独的问题发布:最终通过使用Ajax拦截器找到了一个解决方法,无论使用的框架如何,它都能工作。相关:
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
        }
    }
});