Como obter o código de status da resposta do jQuery.ajax?

230

No código a seguir, tudo o que estou tentando fazer é obter o código de resposta HTTP de uma chamada jQuery.ajax. Em seguida, se o código for 301 (Movido permanentemente), exiba o cabeçalho de resposta 'Local':

<?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 errado? Quando verifico o objeto 'jqxhr' no Firebug, não consigo encontrar o código de status nem o cabeçalho de resposta 'Local'. Defino o ponto de interrupção na última linha de 'complete'.

Muito obrigado.

Mahesh
fonte
Eu sei que isso é velho, mas eu acho que resolveu (XHR.responseURL): stackoverflow.com/a/39416846/4946681
Nate

Respostas:

221

Eu vejo o campo de status no objeto jqXhr, aqui está uma mexida com ele funcionando:

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

$.ajax({
    //...        
    success: function(data, textStatus, xhr) {
        console.log(xhr.status);
    },
    complete: function(xhr, textStatus) {
        console.log(xhr.status);
    } 
});
Adam Ayres
fonte
2
Parece estar funcionando no jsFiddle. Com base nisso e na documentação do jQuery, o xhr.status deve fazer o que eu quero. No entanto, quando eu tento o mesmo no meu código original (txt_status substituído por jqxhr.status), eu continuo recebendo jqxhr.status de 0. Aqui está uma imagem: twitpic.com/4alsqj
Mahesh
10
Acredito que o problema é que você não está executando em um servidor Web, mas localmente no sistema de arquivos. Acho que se você ativasse um servidor da Web local, isso funcionaria corretamente, eis alguns artigos sobre o assunto: pearweb.com/javascript/XMLHttpRequest.html developer.mozilla.org/En/Using_XMLHttpRequest "O principal a ser observado aqui é que o status do resultado está sendo comparado a 0 para obter sucesso, em vez de 200. Isso ocorre porque os esquemas de arquivo e ftp não usam códigos de resultado HTTP ".
Adam Ayres
isso é ótimo. Especialmente quando posso fazer com que meu back-end envie códigos de status.
thatmiddleway
Observe que se a resposta for um status de redirecionamento como 302, isso dará 200
Accountant ant
52

Me deparei com esse antigo thread procurando uma solução semelhante e encontrei a resposta aceita para usar o .complete()método de jquery ajax. Cito o aviso no site jquery aqui:

Os retornos de chamada jqXHR.success (), jqXHR.error () e jqXHR.complete () foram descontinuados a partir do jQuery 1.8. Para preparar seu código para sua eventual remoção, use jqXHR.done (), jqXHR.fail () e jqXHR.always () .

Para saber a status coderesposta de um ajax, pode-se usar o seguinte código:

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

Funciona de maneira semelhante para .done()e.fail()

cara
fonte
2
Isso está retornando "indefinido"
Pedro Joaquín
43

Provavelmente, é mais jQuery idiomático usar a propriedade statusCode do objeto de parâmetro passado para a 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 capturar 301 códigos de status em javascript.

rstackhouse
fonte
41

Quando sua solicitação XHR retorna uma resposta de redirecionamento (status HTTP 301, 302, 303, 307), ela XMLHttpRequest segue automaticamente o URL redirecionado e retorna o código de status desse URL .

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

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

Pode ser necessário alterar a lógica do servidor para responder de uma maneira que você possa manipular o redirecionamento, em vez de permitir que o navegador faça isso. Um exemplo de implementação .

Livingston Samuel
fonte
24

Você pode verificar o conteúdo do respone, basta console.log e você verá que a propriedade possui um código de status. Se você não entende jsons, consulte o vídeo: https://www.youtube.com/watch?v=Bv_5Zv5c-Ts

Explica conhecimentos muito básicos que permitem que você se sinta mais confortável com o javascript.

Você pode fazer isso com a versão mais curta da solicitação ajax, consulte 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 do console:

error 403 
STATUS: Forbidden 
ended
Przemysław Sienkiewicz
fonte
1
Obrigado por fornecer o código completo de como usar done, fail e always, com parâmetros de função completos.
IvanD
4

jqxhr é um objeto json:

retornos completos:
O objeto jqXHR (no jQuery 1.4.x, XMLHTTPRequest) e uma sequência que categoriza o status da solicitação ("êxito", "não modificado", "erro", "tempo limite", "abortar" ou "parsererror") .

veja: jQuery ajax

então você faria:

jqxhr.status para obter o status

Naftali tcp Neal
fonte
2

NB: Usando o 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);
  }
});
SurfingSanta
fonte