xhr.open(method, URL, [async, user, password])
method – método HTTP. Geralmente "GET" ou "POST".URL – a URL para solicitar, uma string, pode ser objeto URL.async – se definido explicitamente como false, a requisição é síncrona.user, password – login e senha para autenticação básica HTTP (se necessário).Importante:
open, ao contrário do nome, não abre a conexão. Ela apenas configura a requisição.send.open() inicializa os parâmetros básicos da conexão.
send() inicia a atividade na rede e abre a conexão.
<body>
<h1>Lista de Produtos</h1>
<button onclick="carregar()">Carregar Dados</button>
<ul id="lista"></ul>
<script>
function carregar() {
const lista = document.getElementById("lista");
lista.innerHTML = "<li>Carregando...</li>";
const xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.restful-api.dev/objects", true);
xhr.send();
if (xhr.status === 200) {
const dados = JSON.parse(xhr.responseText);
lista.innerHTML = "";
dados.forEach(item => {
const li = document.createElement("li");
let info = item.name;
if (item.data) {
info += " | " + JSON.stringify(item.data);
}
li.innerText = info;
lista.appendChild(li);
});
} else {
lista.innerHTML = "<li>Erro ao carregar</li>";
}
}
</script>
</body>
Constantes de Estado readyState:
UNSENT = 0: estado inicialOPENED = 1: método open chamadoHEADERS_RECEIVED = 2: cabeçalhos da resposta recebidosLOADING = 3: resposta sendo carregada (pacote de dados recebido)DONE = 4: requisição completaxhr.onreadystatechange = function() {
if (xhr.readyState == 3) {
// loading
}
if (xhr.readyState == 4) {
// request finished
}
};
Nota: Esses valores indicam o progresso da requisição HTTP. O estado muda automaticamente durante a execução.
status retorna o código HTTP do servidor (ex: 200 para sucesso, 404 para erro).responseText ou response contém o conteúdo retornado pelo servidor.responseType para o navegador já converter o dado (ex: "json").try {
xhr.send();
if (xhr.status != 200) {
alert(`Error ${xhr.status}: ${xhr.statusText}`);
} else {
alert(xhr.response);
}
} catch(err) { // instead of onerror
alert("Request failed");
}
O evento onerror é disparado em falhas de rede ou URLs inválidas.
xhr.onerror = function() {
console.log("Erro na requisição");
};
A propriedade timeout evita que o cliente espere infinitamente por uma resposta.
xhr.timeout = 2000;
xhr.ontimeout = function() {
console.log("Tempo excedido");
};
Nota: O método
abort()permite cancelar requisições desnecessárias em andamento.
Exemplo:
let xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.restful-api.dev/objects");
xhr.onload = function() {
if (xhr.status === 200) {
const data = JSON.parse(xhr.responseText);
console.log(data);
}
};
xhr.send();
fetch("https://api.restful-api.dev/objects")
.then(response => response.json())
.then(data => console.log(data));
open() foi configurado incorretamente? Explique o porquê.timeout, status e o evento onerror para garantir que o sistema não fique inconsistente?XHR: Interface clássica para requisições HTTP no navegador.
readyState indica o progresso da requisição.Próximos Passos:
Dúvidas e Discussão