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