我遇到了与提到here相同的问题:我正在尝试将我的ExtJS 4.1存储与REST API连接,但是当我从存储中删除记录并因此调用HTTP DELETE方法时,它会被拒绝服务器端,因为ExtJS发送的HTTP请求包含body。不幸的是,上面链接上接受的答案对于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请求或类似技术。
答案 0 :(得分:1)
基于AJAX拦截器的解决方法受到this link的启发。无论使用何种框架,此代码都可以解决问题,因此对于不一定使用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);