Come ottenere il testo di risposta dell'errore jQuery $ .ajax?


234

Sto inviando una risposta di errore al mio jQuery. Tuttavia, non riesco a ottenere il testo della risposta (nell'esempio seguente questo sarebbe Andato in spiaggia )

L'unica cosa che dice jQuery è "errore".

Vedi questo esempio per i dettagli:

php

<?
    header('HTTP/1.1 500 Internal Server Error');
    print "Gone to the beach"
?>

jQuery

$.ajax({
    type:     "post",
    data:     {id: 0},
    cache:    false,
    url:      "doIt.php",
    dataType: "text",
    error: function (request, error) {
        console.log(arguments);
        alert(" Can't do because: " + error);
    },
    success: function () {
        alert(" Done ! ");
    }
});

Ora il mio risultato è:

log:

 [XMLHttpRequest readyState=4 status=500, "error", undefined]

mettere in guardia:

Non posso fare perché: errore

Qualche idea?


Il problema sembra essere nel tuo codice php. Non hai bisogno di 2 interruzioni di riga tra le intestazioni e il testo del corpo? La headerfunzione gestisce questo?
rfunduk,

thenduks: PHP sa cosa sta facendo. Il problema è che poiché lo stato HTTP che ritorna è 500, $.ajax()chiama la funzione di errore passata ad esso.
Chris Charabaruk,

Risposte:


309

Provare:

error: function(xhr, status, error) {
  var err = eval("(" + xhr.responseText + ")");
  alert(err.Message);
}

127
Preferisco usare JSON.parse (xhr.responseText)
Phil-R


19
Usare un evalqui non ha molto senso. Se si desidera analizzare una risposta JSON, utilizzare JSON.parse. Nel caso dell'OP, la risposta non è nemmeno JSON o JavaScript, quindi il tuo evalsta solo per causare un SyntaxError.
Mark Amery,

1
JSON.parse necessita di IE8 +. ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ). Se è necessario il supporto per browser meno recenti, utilizzare $ .parseJSON (da jQuery, api.jquery.com/jQuery.parseJSON )
Julian,

1
non cambia il fatto che xhrè indefinito
phil294

53

Per me, questo funziona semplicemente:

error: function(xhr, status, error) {
  alert(xhr.responseText);
}

51

Guarda la responseTextproprietà del parametro request.


Ho un problema di "parsererror" in IE8 ma funziona in IE7 per la richiesta JSONP di origine incrociata. Ma dov'è la proprietà responseText? Non lo vedo da nessuna parte mentre controllo l'oggetto risposta durante il debug. Vedo solo readyState, status, statusText e gli altri metodi dell'oggetto richiesta $ .ajax ().
NLV,

L'oggetto xhr dovrebbe avere responseText o responseXML a seconda del tipo MIME della risposta.
tvanfosson,

Ho trovato il problema. In realtà jquery durante la creazione di una richiesta JSONP non crea affatto l'oggetto XHR. JSON-Padding è solo che vengono aggiunti riferimenti di script dinamici che puntano all'URL e che i dati json verranno raggruppati con un metodo che viene invocato. Quindi XHR non viene usato affatto.
NLV,

Hai un problema con IE8 e cross-origin. . Trascorso tutta la giornata di oggi :( stackoverflow.com/questions/8165557/...
NLV

come analizzi repsponseText in un oggetto json?
dolce


7

Questo è ciò che ha funzionato per me

    function showErrorMessage(xhr, status, error) {
        if (xhr.responseText != "") {

            var jsonResponseText = $.parseJSON(xhr.responseText);
            var jsonResponseStatus = '';
            var message = '';
            $.each(jsonResponseText, function(name, val) {
                if (name == "ResponseStatus") {
                    jsonResponseStatus = $.parseJSON(JSON.stringify(val));
                     $.each(jsonResponseStatus, function(name2, val2) {
                         if (name2 == "Message") {
                             message = val2;
                         }
                     });
                }
            });

            alert(message);
        }
    }

2
xhr.responseJSON è anche disponibile. Quindi possiamo evitare $ .parseJSON (xhr.responseText)
Prasanth

4

Questo ti permetterà di vedere l'intera risposta non solo il valore "responseText"

error: function(xhr, status, error) {
    var acc = []
    $.each(xhr, function(index, value) {
        acc.push(index + ': ' + value);
    });
    alert(JSON.stringify(acc));
}

3

puoi provarlo anche tu:

$(document).ajaxError(
    function (event, jqXHR, ajaxSettings, thrownError) {
        alert('[event:' + event + '], [jqXHR:' + jqXHR + '], [ajaxSettings:' + ajaxSettings + '], [thrownError:' + thrownError + '])');
    });

3

Se si desidera ottenere l' errore di sintassi con il numero di riga, utilizzare questo

error: function(xhr, status, error) {
  alert(error);
}

Non ho ricevuto un numero di riga, ma "avviso (errore)" mi ha dato un "Non trovato" quando ho chiamato $ .get per leggere un file, che era quello di cui avevo bisogno. Il xhr.responseText ha restituito una pagina 404 che mi diceva che il file non esisteva.
James Toomey,

Ciao James, se genera l'errore "Not Found" che significa impossibile trovare il metodo "Url" o "Action".
Karthikeyan P,

3

Il miglior approccio semplice:

error: function (xhr) {
var err = JSON.parse(xhr.responseText);
alert(err.message);
}

0

L'ho usato e ha funzionato perfettamente.

error: function(xhr, status, error){
     alertify.error(JSON.parse(xhr.responseText).error);
}

the xhr.responseText return {errore: "errore in ....."}. quindi, iam usa JSON.parse per analizzare JSON. prova ad usare.
Juan Silupú Maza,

Modifica la risposta se vuoi aggiungere qualcosa. I commenti sono temporanei e le domande / risposte sono più permanenti.
ejderuby,

-1

Se non si verifica un errore di rete e si desidera emergere un errore dal back-end, per esempio con privilegi insufficienti, server la risposta con un 200 e un messaggio di errore. Quindi nel gestore del successo controlla data.status == 'errore'


1
Perché emergere con 200? 200 è lo stato OK. Dovrebbe restituire uno stato di errore con un messaggio personalizzato.
Demenza

la maggior parte delle API che uso in realtà restituisce un 200 con un codice di errore all'interno del corpo della risposta.
amorevole

restituire qualcosa di diverso da 200 può essere problematico quando si desidera far emergere un codice di errore o un messaggio di errore dal back-end. di solito non 200 viene utilizzato per indicare che la richiesta stessa non è riuscita a causa di motivi di rete ... non che l'utente non disponga dell'autorizzazione, ad esempio. Nella nostra app, utilizziamo le promesse nel nostro "MakeAPICall" che cerca un codice di errore in una risposta 200 e attiva il failmetodo anziché il donemetodo. Tutte le richieste restituiscono un oggetto che contiene un oggetto "status" con codice e messaggio.
amante

1
en.wikipedia.org/wiki/HTTP_403 per l'autorizzazione. un po 'di lettura più interessante qui stackoverflow.com/questions/7996569/...~~V~~singular~~3rd
Dementic

403 è un'interpretazione piuttosto semplice ... e non puoi inviare un corpo di risposta. Il mio permesso era solo un esempio. Esistono codici di errore che desidero emergere che sono specifici dell'app. I codici HTTP non comprendono tutti questi.
amante
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.