如何使用 Restful 存储防止 Ext JS 在 DELETE 请求中包含实体主体?

发布于 2024-09-07 18:38:43 字数 1548 浏览 2 评论 0原文

当 Ext JS 从 Restful 存储发出 DELETE 请求时,它包含一个实体主体。虽然这个似乎并没有被禁止 根据 HTTP 规范,Google App Engine 不接受此类请求。所以我想知道是否有一种方法可以防止静态存储在 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}

当这种格式的请求(带有“数据”内容)提交到Google App Engine,它回复:

400 Bad Request

When Ext JS issues a DELETE request from a restful store, it includes an entity body. Although this doesn't seem to be forbidden by the HTTP spec, Google App Engine doesn't accept such requests. So I'd like to know if there is a way to prevent a restful store from including a redundant entity body on DELETE requests.

Details:

Using this sample as reference:
http://www.sencha.com/deploy/dev/examples/restful/restful.html

This is how the store is defined:

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

After pressing the "Delete" button, this is the request Ext JS sends:

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}

When a request in this format (with the "data" content) is submitted to Google App Engine, it replies with:

400 Bad Request

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

好久不见√ 2024-09-14 18:38:43

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

You can fix this problem, as you guessed, by overriding a method in the HttpProxy class. First, add this code:

// 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);
}
});

Then, use this new class ("GAEHttpProxy") instead of HttpProxy in the rest of your code (for instance, when you create the proxy you use in your store shown above). This worked for me, and I hope it works for you!

回眸一笑 2024-09-14 18:38:43

虽然这个问题是 7 年前提出的,而且我们现在有了 sencha 6,但问题还没有解决 OOTB。所以这是我的工作解决方案:

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'

Although the question is asked 7 years ago and we have sencha 6 now, the problem isn't solved OOTB yet. So here is my working solution:

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
        }
    }
});

We could also do this check: request.config.method === 'DELETE' but for some reason it always returns false. So I recommend to stay with action === 'destroy'

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文