2010-06-25 8 views
6

Cuando Ext JS emite una solicitud DELETE de un restful store, incluye un cuerpo de entidad. Aunque este doesn't seem to be forbidden por especificación HTTP, Google App Engine no acepta tales solicitudes. Así que me gustaría saber si existe una forma de evitar que una tienda de descanso incluya un cuerpo de entidad redundante en las solicitudes DELETE.¿Cómo puedo evitar que Ext JS incluya un cuerpo de entidad en las solicitudes DELETE usando un restful store?

Detalles:

Uso este ejemplo como referencia: http://www.sencha.com/deploy/dev/examples/restful/restful.html

Así es como se define la tienda:

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

Después de pulsar el botón "Borrar", este es el solicitar Ext JS envía:

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} 

Cuando una petición en este formato (con el contenido de "datos") se somete a Google App Engine, responde con:

400 Bad Request 
+0

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

Respuesta

7

puede solucionar este problema, como lo has adivinado, reemplazando un método en el la clase HttpProxy. En primer lugar, agregue este código:

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

A continuación, utilice esta nueva clase ("GAEHttpProxy") en lugar de HttpProxy en el resto de su código (por ejemplo, cuando se crea el proxy que utiliza en su tienda se muestra arriba) . Esto funcionó para mí, y espero que funcione para usted.

+1

Impresionante, que de hecho funciona. Lo probé en App Engine. Muchas gracias, no solo publicaron un código de limpieza que resolvió el problema, sino que también demostraron cómo personalizar el proxy. Buen trabajo. –

+2

Esto no parece aplicarse a ExtJS 4. doRequest ahora tiene los parámetros 'operation, callback, scope'. – CoderDennis

+0

@CoderDennis Tampoco se pudo aplicar esta respuesta a Ext JS 4, por lo que se publicó como una pregunta separada: http://stackoverflow.com/questions/33153400/http-delete-request-without-body/33185537 Finalmente encontré una solución mediante el uso de interceptor Ajax, funciona independientemente del marco utilizado. –

0

Aunque la pregunta se hace hace 7 años y ahora tenemos sencha 6, el problema no está resuelto OOTB todavía. Así que aquí está mi solución de trabajo:

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

También podríamos hacer esta comprobación: request.config.method === 'DELETE' pero por alguna razón siempre devuelve falso. Así que recomiendo quedarse con action === 'destroy'

Cuestiones relacionadas