当前位置:  开发笔记 > 编程语言 > 正文

如何防止Ext JS使用restful商店在DELETE请求中包含实体主体?

如何解决《如何防止ExtJS使用restful商店在DELETE请求中包含实体主体?》经验,为你挑选了1个好方法。

当Ext JS从restful商店发出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}

当此格式的请求(带有"数据"内容)提交给Google App Engine时,它会回复:

400 Bad Request

小智.. 7

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



1> 小智..:

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


这似乎不适用于ExtJS 4. doRequest现在具有`operation,callback,scope`参数.
推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有