Como obter o texto de resposta de erro do jQuery $ .ajax?


234

Estou enviando uma resposta de erro ao meu jQuery. No entanto, não consigo obter o texto da resposta (no exemplo abaixo, este foi para a praia )

A única coisa que o jQuery diz é 'erro'.

Veja este exemplo para detalhes:

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 ! ");
    }
});

Agora meu resultado é:

registro:

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

alerta:

Não é possível fazer porque: erro

Alguma ideia?


O problema parece estar no seu código php. Você não precisa de duas quebras de linha entre os cabeçalhos e o texto do corpo? A headerfunção lida com isso?
Rfunduk 28/10/09

thenduks: PHP sabe o que está fazendo. O problema é que, como o status HTTP retornado é 500, $.ajax()chama a função de erro passada para ele.
22430 Chris Charabaruk

Respostas:


309

Experimentar:

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

127
Eu prefiro usar JSON.parse (xhr.responseText)
Phil-R


19
Usar um evalaqui não faz muito sentido. Se você deseja analisar uma resposta JSON, use JSON.parse. No caso do OP, a resposta não é nem JSON ou JavaScript; portanto, você evalcausará um SyntaxError.
Mark27 Aug14

1
JSON.parse precisa do IE8 +. ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ). Se for necessário suporte para navegadores mais antigos, use $ .parseJSON (de jQuery, api.jquery.com/jQuery.parseJSON )
Julian

1
não muda o fato de que xhré indefinido
phil294

53

Para mim, isso simplesmente funciona:

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

51

Veja a responseTextpropriedade do parâmetro request.


Eu tenho um problema 'parsererror' no IE8, mas estou trabalhando no IE7 para solicitação JSONP de origem cruzada. Mas onde está a propriedade responseText? Não o vejo em nenhum lugar enquanto verifica o objeto de resposta durante a depuração. Eu vejo apenas readyState, status, statusText e os outros métodos do objeto de solicitação $ .ajax ().
NLV

O objeto xhr deve ter responseText ou responseXML, dependendo do tipo MIME da resposta.
Tvanfosson 17/11

Eu encontrei o problema Na realidade, o jquery ao criar uma solicitação JSONP não criará nenhum objeto XHR. JSON-Padding é apenas que referências de script dinâmicas são adicionadas apontando para a URL e os dados do json serão agrupados com um método que é chamado. Portanto, o XHR não é usado.
NLV

Tem um problema com o IE8 e com origem cruzada. Passei o dia inteiro hoje :(. Stackoverflow.com/questions/8165557/…
NLV

como você analisa repsponseText em um objeto json?
Chovy


7

Isto é o que funcionou para mim

    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 também está disponível. Assim, podemos evitar $ .parseJSON (xhr.responseText)
Prasanth

4

Isso permitirá que você veja toda a resposta, não apenas o valor "responseText"

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

3

você pode tentar também:

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

3

Se você deseja obter o erro de sintaxe com o número da linha, use este

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

Não recebi um número de linha, mas "alert (error)" me deu um "Not Found" quando liguei para $ .get para ler um arquivo, que era o que eu precisava. O xhr.responseText retornou uma página 404 informando que o arquivo não existia.
James Toomey

Olá James, se for lançado o erro "Não encontrado", que significa incapaz de encontrar o método "Url" ou "Ação".
Karthikeyan P

3

A melhor abordagem simples:

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

0

Eu usei isso, e funcionou perfeitamente.

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

o xhr.responseText retorna {error: "error in ....."}. então, iam use JSON.parse para analisar JSON. tente usar.
Juan Silupú Maza 15/08/19

Edite a resposta se desejar adicionar algo a ela. Os comentários são temporários e as perguntas / respostas são mais permanentes.
ejderuby

-1

Se você não está tendo um erro de rede e deseja exibir um erro do back-end, por exemplo, privilégios insuficientes, servidor sua resposta com 200 e uma mensagem de erro. Em seguida, no seu manipulador de sucesso, verifique data.status == 'erro'


1
Por que superfície com 200? 200 está no status OK. Ele deve retornar um status de erro com uma mensagem personalizada.
Dementic

a maioria das APIs que eu uso realmente retorna um 200 com um código de erro dentro do corpo da resposta.
Chovy

retornar algo diferente de 200 pode ser problemático quando você deseja exibir um código de erro ou uma mensagem de erro do back-end. non-200 é geralmente usado para indicar que a solicitação em si falhou devido a razões de rede ... não que o usuário não tenha permissão, por exemplo. Em nosso aplicativo, usamos promessas em nosso "MakeAPICall", que procura um código de erro em uma resposta 200 e aciona o failmétodo em vez do donemétodo. Todas as solicitações retornam um objeto que contém um objeto 'status' com código e mensagem.
chovy

1
pt.wikipedia.org/wiki/HTTP_403 para obter a permissão. um pouco mais interessante, leia aqui stackoverflow.com/questions/7996569/…
Dementic

403 é uma interpretação bastante básica ... e você não pode enviar um corpo de resposta. Minha permissão foi apenas um exemplo. Existem códigos de erro que quero que sejam específicos do aplicativo. Os códigos HTTP não abrangem todos esses.
Chovy
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.