2010-06-18 18 views
9

Hemos escrito una API de servidor RESTful. Por alguna razón, tomamos la decisión de que para DELETE, nos gustaría devolver un código de estado 204 (Sin contenido), con una respuesta vacía. Estoy intentando llamar esto desde jQuery, pasando de un controlador de éxito y establecer el verbo eliminar:

jQuery.ajax({ 
    type:'DELETE', 
    url: url, 
    success: callback, 
}); 

El servidor devuelve un 204, pero el manejador de éxito nunca se llama. ¿Hay alguna manera de configurar jQuery para permitir que los 204 disparen el controlador de éxito?

Respuesta

11

204 debe ser tratado como el éxito. ¿Qué versión de jQuery estás usando? Hice un par de pruebas y los 200 códigos de estado de rango fueron para el controlador de éxito. La fuente de jQuery 1.4.2 confirma esto:

// Determines if an XMLHttpRequest was successful or not 
httpSuccess: function(xhr) { 
    try { 
     // IE error sometimes returns 1223 when 
     // it should be 204 so treat it as success, see #1450 
     return !xhr.status && location.protocol === "file:" || 
      // Opera returns 0 when status is 304 
      (xhr.status >= 200 && xhr.status < 300) || 
      xhr.status === 304 || xhr.status === 1223 || xhr.status === 0; 
    } catch(e) {} 

    return false; 
}, 
+0

Bien, ahora estoy confundido. Intento esto de nuevo, y parece estar funcionando. Parece que debo haber estado haciendo algo incorrectamente. Gracias! – Bennidhamma

3
jQuery.ajax({ 
    ... 
    error: function(xhr, errorText) { 
     if(xhr.status==204) successCallback(null, errorText, xhr); 
     ... 
    }, 
    ... 
}); 

fea ... pero podría ayudar a

+0

Gracias sje397, eso tiene sentido. ¿Crees que es la única manera? – Bennidhamma

9

Tuve un problema simliar porque mi script también estaba enviando el "Content-Type" de cabecera como "application/json". Mientras que la solicitud tuvo éxito, no pudo JSON.parse una cadena vacía.

2

Es técnicamente un problema en el servidor
Como Pablo dijo, un 204 una respuesta vacía con un servidor de contenido de tipo de JSON es tratada por jQuery como un error.

Puede evitarlo en jQuery anulando manualmente dataType a 'text'.

$.ajax({ 
    url: url, 
    dataType:'text', 
    success:(data){ 
     //I will now fire on 204 status with empty content 
     //I have beaten the machine. 
    } 
}); 
2

Ésta es forma alternativa de devolución de llamada en caso de éxito ... Creo que va a trabajar para usted.

$.ajax({ 
    url: url, 
    dataType:'text', 
    statusCode: { 
       204: function (data) { 
        logic here 
       } 
}); 
Cuestiones relacionadas