Como obter o código de Estado de resposta de jQuery.ajax?

no seguinte código, tudo o que estou a tentar fazer é obter o código de resposta HTTP de um jQuery.o ajax ligou. Então, se o código for 301 (movido permanentemente), mostre o cabeçalho de resposta "localização":

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>jQuery 301 Trial</title>
  <script src="http://code.jquery.com/jquery-1.5.1.min.js"></script>

  <script type="text/javascript">
  function get_resp_status(url) {
    $.ajax({
      url: url,
      complete: function (jqxhr, txt_status) {
        console.log ("Complete: [ " + txt_status + " ] " + jqxhr);
        // if (response code is 301) {
        console.log ("Location: " + jqxhr.getResponseHeader("Location"));
        // }
      }
    });
  }
  </script>
  <script type="text/javascript">
  $(document).ready(function(){
    $('a').mouseenter(
      function () {
        get_resp_status(this.href);
      },
      function () {
      }
    );
  });
  </script>
</head>
<body>
  <a href="http://ow.ly/4etPl">Test 301 redirect</a>
  <a href="http://cnn.com/not_found">Test 404 not found</a>
</body>
</html>
Alguém pode apontar para onde estou a ir mal? Quando verifico o objecto 'jqxhr' no Firebug, não consigo encontrar o código de Estado, nem o cabeçalho de resposta 'localização'. Defini o ponto de paragem na última linha de "completo".

Muito obrigado.

Author: Mahesh, 2011-03-17

7 answers

Eu vejo o campo de Estado no objecto jqXhr, aqui está um violino com ele a funcionar:

Http://jsfiddle.net/magicaj/55HQq/3/

$.ajax({
    //...        
    success: function(data, textStatus, xhr) {
        console.log(xhr.status);
    },
    complete: function(xhr, textStatus) {
        console.log(xhr.status);
    } 
});
 231
Author: Adam Ayres, 2011-03-17 19:30:54

Deparei - me com este velho tópico à procura de uma solução semelhante e encontrei a resposta aceite para usar o método .complete() de jquery ajax. Passo a citar o aviso no sítio web do jquery aqui:

O jqXHR.success (), jqXHR.error(), and jqXHR.complete() callbacks are deprecated as of jQuery 1.8. Para preparar seu código para sua eventual remoção, use jqXHR.done (), jqXHR.fail () e jqXHR.sempre () em vez disso.

Para conhecer o status code de uma resposta ajax, pode-se usar o seguinte código:

$.ajax( url [, settings ] )
.always(function (jqXHR) {
    console.log(jqXHR.status);
});

Funciona similarmente para .done() e .fail()

 53
Author: face, 2018-01-27 16:41:21

É provavelmente mais idiomático jQuery usar a propriedade do código de estado do objeto parâmetro passado para o $.função ajax:

$.ajax({
  statusCode: {
    500: function(xhr) {
      if(window.console) console.log(xhr.responseText);
    }
  }
});

No entanto, como Livingston Samuel Disse, não é possível apanhar os códigos de estado 301 em javascript.

 48
Author: rstackhouse, 2017-05-23 12:26:26

Quando o seu pedido XHR devolve uma resposta de redireccionamento (HTTP Status 301, 302, 303, 307), o XMLHttpRequest segue automaticamente o URL redireccionado e devolve o código de estado desse URL.

Você pode obter os códigos de status de não redirecionamento (200, 400, 500 etc) através da propriedade status do objeto xhr.

Então você não pode obter a localização redirecionada a partir do cabeçalho de resposta de um 301, 302, 303 ou 307 pedido.

Você pode ter que mudar a sua lógica do servidor para responda de uma forma que você pode lidar com o redirecionamento, em vez de deixar o navegador fazê-lo. Um exemplo de implementação .

 41
Author: Livingston Samuel, 2012-08-02 13:30:57
Pode verificar o seu conteúdo respiratório, apenas consola.regista-o e verás que a propriedade whitch tem um código de Estado. Se você não entender jsons, por favor, consulte o vídeo: https://www.youtube.com/watch?v=Bv_5Zv5c-Ts Explica o conhecimento básico que te deixa mais confortável com o javascript.

Pode fazê-lo com uma versão mais curta do pedido ajax, por favor veja o código acima:

$.get("example.url.com", function(data) {
                console.log(data);
            }).done(function() {
               // TO DO ON DONE
            }).fail(function(data, textStatus, xhr) {
                 //This shows status code eg. 403
                 console.log("error", data.status);
                 //This shows status message eg. Forbidden
                 console.log("STATUS: "+xhr);
            }).always(function() {
                 //TO-DO after fail/done request.
                 console.log("ended");
            });

Exemplo de saída da consola:

error 403 
STATUS: Forbidden 
ended
 26
Author: Przemysław Sienkiewicz, 2016-10-26 08:03:30

NB: utilizar jQuery 3.4.1

$.ajax({
  url: URL,
  success: function(data, textStatus, jqXHR){
    console.log(textStatus + ": " + jqXHR.status);
    // do something with data
  },
  error: function(jqXHR, textStatus, errorThrown){
    console.log(textStatus + ": " + jqXHR.status + " " + errorThrown);
  }
});
 9
Author: SurfingSanta, 2019-11-12 20:29:29

O Jqxhr é um objecto json:

Devolve Completo:
o jqXHR (em jQuery 1, 4.x, XMLHttpRequest) object and a string categorizar o estado do pedido ("sucesso", "notmodified","erro", "timeout", "abort", ou "parsererror").

Ver: JQuery ajax

Então você faria:

jqxhr.status para obter o status

 4
Author: Naftali aka Neal, 2011-03-17 19:32:18