2010-06-25 22 views
6

Khi Ext JS đưa ra yêu cầu DELETE từ một cửa hàng an toàn, nó bao gồm một thực thể. Mặc dù thông số HTTP doesn't seem to be forbidden này, Google App Engine không chấp nhận các yêu cầu như vậy. Vì vậy, tôi muốn biết nếu có một cách để ngăn chặn một cửa hàng an toàn từ bao gồm một cơ quan thực thể dư thừa trên các yêu cầu DELETE.Làm cách nào để ngăn chặn Ext JS bao gồm một thực thể trong các yêu cầu DELETE bằng cách sử dụng một cửa hàng an toàn?

chi tiết:

Sử dụng mẫu này để tham khảo: http://www.sencha.com/deploy/dev/examples/restful/restful.html

Đây là cách các cửa hàng được định nghĩa:

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

Sau khi nhấn nút "Delete", đây là yêu cầu Ext JS gửi:

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} 
.210

Khi một yêu cầu ở định dạng này (với các "dữ liệu" nội dung) được gửi tới Google App Engine, nó trả lời với:

400 Bad Request 
+0

Related: http://stackoverflow.com/questions/33153400/http-delete-request-without-body/33185537 –

Trả lời

7

Bạn có thể khắc phục vấn đề này, như bạn đoán, bằng cách ghi đè một phương pháp trong lớp HttpProxy. Đầu tiên, thêm mã này:

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

Sau đó, sử dụng lớp mới này ("GAEHttpProxy") thay vì HttpProxy trong phần còn lại của mã của bạn (ví dụ, khi bạn tạo proxy bạn sử dụng trong cửa hàng của bạn hiển thị ở trên) . Điều này làm việc cho tôi, và tôi hy vọng nó làm việc cho bạn!

+1

Tuyệt vời, điều đó thực sự hiệu quả. Tôi đã thử nghiệm nó trên App Engine. Cảm ơn bạn rất nhiều, bạn không chỉ đăng sạch mã mà giải quyết vấn đề, nhưng đã chứng minh làm thế nào để tùy chỉnh proxy. Công việc tốt. –

+2

Điều này dường như không áp dụng cho ExtJS 4. doRequest có tham số 'hoạt động, gọi lại, phạm vi' bây giờ. – CoderDennis

+0

@CoderDennis Cũng không thể áp dụng câu trả lời này cho Ext JS 4, do đó, đăng nó như là một câu hỏi riêng biệt: http://stackoverflow.com/questions/33153400/http-delete-request-without-body/33185537 Cuối cùng tìm thấy một workaround bằng cách sử dụng Ajax interceptor, nó hoạt động bất kể khung được sử dụng. –

0

Mặc dù câu hỏi được hỏi 7 năm trước và chúng tôi có sencha 6 bây giờ, vấn đề chưa được giải quyết OOTB. Vì vậy, đây là giải pháp làm việc của tôi:

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

Chúng tôi cũng có thể làm việc kiểm tra này: request.config.method === 'DELETE' nhưng đối với một số lý do nó luôn luôn trả về false. Vì vậy, tôi khuyên bạn nên ở lại với action === 'destroy'

Các vấn đề liên quan