2010-09-18 3 views
61

Wie kann ich den Antworttyp von Ajax-Aufruf in Jquery ermitteln? Manchmal sendet der Server JSON-Antwort und manchmal sendet es nur den HTML-Code für die Anzeige. Im Moment bin ich mitjquery wie Antworttyp für Ajax-Aufruf zu überprüfen

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

Sie können es überprüfen über 'typeof response ==" object "' – Imdad

+0

Haben Sie versucht, den Header MIME-Typ der Antwort zu betrachten? – Dick

Antwort

106

Sie können versuchen, es mag:

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

Grundsätzlich ist es auch indexOf verwenden, aber es scheint zuverlässiger.

+0

BTW Ich würde vorschlagen, dass Sie nur ein Format verwenden, wenn möglich. Selbst wenn Sie eine einfache Nachricht anzeigen, können Sie den JSON auch verwenden. –

+0

Vielen Dank. Dies ist genau das, was ich suche oder. Ich wünsche jquery hat eine Abkürzung dafür :) – sam

+0

Danke dafür ... sollte realisiert haben wir könnten die Header schauen;) –

0

Um eine JSON-Antwort zu akzeptieren, können Sie den Antworttyp als JSON festlegen. Ich entwerfe normalerweise meinen serverseitigen Code, so dass sie immer JSON-Antwort zurückgeben. In dem Fall, dass es aus irgendeinem Grund nicht funktioniert, würde ich einen Fehler in meinem AJAX-Aufruf bekommen, weil ich ein falsches JSON-Format habe und ich kann die Antwort vom Server so behandeln, dass sie nicht nicht JSON ist.

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

Stört das nicht die Fehlerbehandlungsprozedur? Mein Darm sagt, dass es hackish ist ... –

+0

natürlich könnte ich meinen Server bitten, einen Logikfehler zurückzugeben, der als JSON formatiert ist, aber wenn Ihr Server unten oder gebrochen ist, erhalten Sie keinen JSON-Körper. – Ivan

8

Die Antworten oben für mich funktioniert nicht so kam ich mit dieser Lösung:

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

Dies wird wahrscheinlich nicht funktionieren, wenn der Inhaltstyp zum Beispiel "text/html; charset = UTF-8" – Steven

14

Sie einfach Javascript der einfache Methode verwenden, um den Typ

dh

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

Wenn Sie diese Methode verwenden, müssen Sie im Erfolgsrückruf nicht 2 zusätzliche Parameter schreiben.

+0

Dies ist ein bisschen ein Hack, aber es ist die einfachste Lösung. –

6

Wenn die Antwort als JSON analysiert wird, hat das Objekt jqXHR die Eigenschaft 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 
    } 
}) 

Vom jQuery.ajax documentation:

Wenn json angegeben, wird die Antwort analysiert wird jQuery.parseJSON verwenden, bevor übergeben wird, als ein Objekt, zum Erfolg Handler. Das geparste JSON-Objekt wird über die responseJSON-Eigenschaft des jqXHR-Objekts verfügbar gemacht.

+0

Dies ist nicht korrekt, da die Antwort "Hydration" auf dem von Ihnen angeforderten Format beruht. Ich testete einen Aufruf wie '$ .ajax ({.., dataType: 'html'})' und von der Server-Seite sende ich eine 'application/json' Antwort, aber jQuery füllt das jqXHR.responseJSON Feld nicht. –

+0

In der Tat, aber der OP wollte den Antworttyp wissen.Warum würden Sie 'dataType: 'html' angeben, wenn Sie wissen, dass der Server' html 'nicht sendet? Wenn Sie "dataType" angeben, wird jQuery gezwungen, diesen Datentyp zu verwenden und die automatische Erkennung zu überspringen. – tyrion

+0

Ja, wahrscheinlich, aber in meinem Fall, wenn ich nicht die 'html' Anfrage angeben, gibt Symfony das Formular in JSON zurück, das ich nicht will. Spezifische Situationen in der Tat. –

Verwandte Themen