2010-09-18 8 views
61

¿Cómo puedo determinar el tipo de respuesta de la llamada ajax en Jquery? A veces, el servidor envía una respuesta json y, en ocasiones, solo envía el html para fines de visualización. En este momento estoy usandojquery cómo verificar el tipo de respuesta para la llamada ajax

if(response.indexOf('Error')) 
    //popup error message 
else 
response.username 
response.address 
+1

Puede verificarlo a través de 'typeof response ==" object "' – Imdad

+0

¿Intentó mirar el tipo MIME del encabezado de la respuesta? – Dick

Respuesta

106

Puede probarlo como:

$.ajax({ 
    type: "POST", 
    url: "your url goes here", 
    data: "data to be sent", 
    success: function(response, status, xhr){ 
    var ct = xhr.getResponseHeader("content-type") || ""; 
    if (ct.indexOf('html') > -1) { 
     //do something 
    } 
    if (ct.indexOf('json') > -1) { 
     // handle json here 
    } 
    } 
}); 

Básicamente se utiliza también indexOf pero parece más fiable.

+0

BTW Le sugiero que use solo un formato si es posible. Como incluso si está mostrando un mensaje simple, también puede usar el json. –

+0

Muchas gracias. Esto es exactamente lo que estoy buscando o. Ojalá jquery tenga un atajo para esto :) – sam

+0

Gracias por esto ... deberíamos haber dado cuenta de que podríamos mirar los encabezados;) –

0

Para aceptar una respuesta JSON, puede establecer el tipo de respuesta como JSON. Normalmente diseño mi código del lado del servidor para que siempre devuelvan la respuesta JSON. En caso de que no lo haga por cualquier razón, obtendría un error en mi llamada AJAX por tener un formato JSON incorrecto y puedo procesar la respuesta del servidor como si no fuera JSON.

error: function(response, status, xhr){ 
// do something with the reply. 
} 
+0

¿Eso no complica el procedimiento de manejo de errores? Mi instinto dice que es hackish ... –

+0

off-course Podría pedirle a mi servidor que devuelva un error lógico formateado como JSON, pero cuando tu servidor esté dañado o roto, no obtendrás un cuerpo JSON. – Ivan

8

Las respuestas anteriores no funcionó para mí, así que se acercó con esta solución:

success: function(data, textStatus , xhr) { 
if(xhr.responseXML.contentType == "text/html") { 
    //do something with html 
    } 
else if(xhr.responseXML.contentType == "application/json") { 
    //do something with json 
    }} 
+0

Esto probablemente no funcionará si el tipo de contenido es, por ejemplo, "text/html; charset = UTF-8" – Steven

14

puede simplemente usar método fácil de javascript para comprobar el tipo

es decir

if(typeof response=="object") 
{ 
// Response is javascript object 
} 
else 
{ 
// Response is HTML 
} 

Si utiliza este método, no tiene que escribir 2 parámetros adicionales en la devolución de llamada exitosa.

+0

Esto es un truco, pero es la solución más simple. –

6

Si la respuesta se analiza como JSON, el objeto jqXHR tendrá una propiedad responseJSON.

$.ajax(
    // ... 
).done(function(data, textStatus, jqXHR) { 
    if (jqXHR.responseJSON) { 
     // handle JSON 
    } else { 
     // handle html 
    } 
}).fail(function(jqXHR, textStatus, errorThrown) { 
    if (jqXHR.responseJSON) { 
     // handle JSON 
    else { 
     // handle html 
    } 
}) 

Desde el jQuery.ajax documentation:

Si se especifica JSON, la respuesta se analiza usando jQuery.parseJSON antes de ser pasado, como un objeto, al controlador de éxito. El objeto JSON analizado está disponible a través de la propiedad responseJSON del objeto jqXHR.

+0

Esto no es exacto porque la respuesta "hidratación" se basa en el formato que solicitó. Probé una llamada como '$ .ajax ({.., dataType: 'html'})' y desde el lado del servidor envío una respuesta 'application/json', pero jQuery no llena el campo jqXHR.responseJSON. –

+0

De hecho, pero el OP quería saber el tipo de respuesta.¿Por qué debería especificar 'dataType: 'html'' si sabe que el servidor no enviará' html '? Probablemente, especificar 'dataType' obliga a jQuery a usar ese tipo de datos, omitiendo la detección automática. – tyrion

+0

Sí, probablemente, pero en mi caso, si no especifico la solicitud 'html', symfony devuelve el formulario en JSON que yo no quiero. Situaciones específicas de hecho –

Cuestiones relacionadas