2010-09-18 7 views
61

Come posso determinare il tipo di risposta della chiamata ajax in Jquery? A volte, il server invia una risposta JSON ea volte invia solo l'html per scopi di visualizzazione. In questo momento sto usandojquery come controllare il tipo di risposta per la chiamata ajax

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

È possibile controllarlo tramite 'typeof response ==" oggetto "' – Imdad

+0

Hai provato a guardare il tipo MIME di intestazione della risposta? – Dick

risposta

106

Si può provare le cose come:

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

Fondamentalmente si è anche utilizzando indexOf ma sembra più affidabile.

+0

BTW Suggerirei di utilizzare solo un formato, se possibile. Come se tu stessi mostrando un semplice messaggio, puoi anche usare il json. –

+0

Grazie mille. Questo è esattamente ciò che sto cercando o. Vorrei che jquery abbia una scorciatoia per questo :) – sam

+0

Grazie per questo ... dovremmo aver realizzato che potremmo guardare le intestazioni;) –

0

Per accettare una risposta JSON, è possibile impostare il tipo di risposta come JSON. Di solito disegno il mio side code del server in modo che restituiscano sempre la risposta JSON. Nel caso in cui non riesca a farlo per qualsiasi motivo, ricevo un errore nella mia chiamata AJAX per avere un formato JSON errato e posso elaborare la risposta dal server come non JSON.

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

Non confonde la procedura di gestione degli errori? Il mio istinto dice che è hackish ... –

+0

off-course Potrei chiedere al mio server di restituire un errore logico formattato come JSON, ma quando il tuo server è inattivo o non funzionante, non avrai un corpo JSON. – Ivan

8

Le risposte di cui sopra non ha funzionato per me, così mi si avvicinò con questa soluzione:

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

Probabilmente non funzionerà se il tipo di contenuto è ad esempio "text/html; charset = UTF-8" – Steven

14

si può semplicemente utilizzare il metodo facile di javascript per verificare il tipo di

cioè

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

Se si utilizza questo metodo non è necessario scrivere 2 parametri aggiuntivi nella richiamata di successo.

+0

Questo è un po 'un trucco, ma è la soluzione più semplice. –

6

Se la risposta viene analizzata come JSON, l'oggetto jqXHR avrà una proprietà 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 
    } 
}) 

Dal jQuery.ajax documentation:

Se non viene specificato JSON, la risposta viene analizzato utilizzando jQuery.parseJSON prima di essere passato, come un oggetto, al gestore di successo. L'oggetto JSON analizzato è reso disponibile attraverso la proprietà responseJSON dell'oggetto jqXHR.

+0

Questo non è accurato perché la risposta "idratazione" si basa sul formato richiesto. Ho provato una chiamata come '$ .ajax ({.., dataType: 'html'})' e dal lato server invio una risposta 'application/json', ma jQuery non riempie il campo jqXHR.responseJSON. –

+0

Infatti, ma l'OP voleva conoscere il tipo di risposta.Perché dovresti specificare 'dataType: 'html'' se sai che il server non invierà' html '? Probabilmente specificando 'dataType' forza jQuery a usare quel tipo di dati, saltando il rilevamento automatico. – tyrion

+0

Sì, probabilmente, ma nel mio caso, se non si specifica la richiesta 'html', symfony restituisce il modulo in JSON che non desidero. Situazioni specifiche in effetti. –

Problemi correlati