AJAX XMLHttpRequest


Índice

    Mostrar índice


O objeto XMLHttpRequest é usado para solicitar dados de um servidor.


Envie uma solicitação para um servidor

Para enviar uma solicitação a um servidor, usamos os métodos open() e send() do objeto XMLHttpRequest:

xhttp.open("GET", "ajax_info.txt", true);
 xhttp.send();
open(method, url, async)

Especifica o tipo de solicitação

método: o tipo de solicitação: GET ou POST
url: a localização do servidor (arquivo)
assíncrono: verdadeiro (assíncrono) ou falso (síncrono)

send()

Envia a solicitação ao servidor (usado para GET)

send(string)

Envia a solicitação ao servidor (usado para POST)


O URL - um arquivo em um servidor

O parâmetro url do método open() é um endereço para um arquivo em um servidor:

xhttp.open("GET", "ajax_test.asp", true);

O arquivo pode ser qualquer tipo de arquivo, como .txt e .xml ou arquivos de script de servidor como .asp e .php (que podem executar ações no servidor antes de enviar a resposta de volta).


Assíncrono - Verdadeiro ou Falso?

As solicitações do servidor devem ser enviadas de forma assíncrona.

O parâmetro assíncrono do open() o método deve ser definido como verdadeiro:

xhttp.open("GET", "ajax_test.asp", true);

Ao enviar de forma assíncrona, o JavaScript não precisa esperar pela resposta do servidor, mas pode:

  • execute outros scripts enquanto aguarda a resposta do servidor

  • lidar com a resposta depois que a resposta estiver pronta

O valor padrão para o parâmetro async é async=true.

Você pode remover com segurança o terceiro parâmetro do seu código.

XMLHttpRequest síncrono (async=false) não é recomendado porque o JavaScript irá pare de executar até que a resposta do servidor esteja pronta. Se o servidor estiver ocupado ou lento, o o aplicativo irá travar ou parar.


Solicitação GET ou solicitação POST?

GET é mais simples e rápido que POST e pode ser usado na maioria dos casos.

No entanto, sempre use solicitações POST quando:

  • Um arquivo em cache não é uma opção (atualizar um arquivo ou banco de dados no servidor).

  • Envio de uma grande quantidade de dados para o servidor (o POST não tem limitações de tamanho).

  • Ao enviar a entrada do usuário (que pode conter caracteres desconhecidos), o POST é mais robusto e seguro que o GET.


OBTER solicitações

Uma simples solicitação GET:

Exemplo

xhttp.open("GET", "demo_get.asp");
 xhttp.send();

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<h2>The XMLHttpRequest Object</h2>
<button type="button" onclick="loadDoc()">Request data</button>
<p id="demo"></p>

<script>
function loadDoc() {
  const xhttp = new XMLHttpRequest();
  xhttp.onload = function() {
    document.getElementById("demo").innerHTML = this.responseText;
  }
  xhttp.open("GET", "demo_get.asp");
  xhttp.send();
}
</script>

</body>
</html>

No exemplo acima, você pode obter um resultado em cache. Para evitar isso, adicione um ID exclusivo ao URL:

Exemplo

xhttp.open("GET", "demo_get.asp?t=" + Math.random());
 xhttp.send();

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<h2>The XMLHttpRequest Object</h2>
<button type="button" onclick="loadDoc()">Request data</button>

<p id="demo"></p>

<script>
function loadDoc() {
  const xhttp = new XMLHttpRequest();
  xhttp.onload = function() {
    document.getElementById("demo").innerHTML = this.responseText;
  }
  xhttp.open("GET", "demo_get.asp?t=" + Math.random());
  xhttp.send();
}
</script>

</body>
</html>

Se você deseja enviar informações com o método GET, adicione as informações à URL:

Exemplo

xhttp.open("GET", "demo_get2.asp?fname=Henry&lname=Ford");
 xhttp.send();

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<h2>The XMLHttpRequest Object</h2>
<button type="button" onclick="loadDoc()">Request data</button>

<p id="demo"></p>

<script>
function loadDoc() {
  const xhttp = new XMLHttpRequest();
  xhttp.onload = function() {
    document.getElementById("demo").innerHTML = this.responseText;
  }
  xhttp.open("GET", "demo_get2.asp?fname=Henry&lname=Ford");
  xhttp.send();
}
</script>
 
</body>
</html>

Como o servidor usa a entrada e como o servidor responde a uma solicitação será explicado em um capítulo posterior.



Solicitações POST

Uma simples solicitação POST:

Exemplo

xhttp.open("POST", "demo_post.asp");
 xhttp.send();

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<h2>The XMLHttpRequest Object</h2>
<button type="button" onclick="loadDoc()">Request data</button>

<p id="demo"></p>
 
<script>
function loadDoc() {
  const xhttp = new XMLHttpRequest();
  xhttp.onload = function() {
    document.getElementById("demo").innerHTML = this.responseText;
  }
  xhttp.open("POST", "demo_post.asp");
  xhttp.send();
}
</script>

</body>
</html>

Para POST dados como um formulário HTML, adicione um cabeçalho HTTP com setRequestHeader(). Especifique os dados que deseja enviar no método send():

Exemplo

xhttp.open("POST", "ajax_test.asp");
 xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
 xhttp.send("fname=Henry&lname=Ford");

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<h2>The XMLHttpRequest Object</h2>
<button type="button" onclick="loadDoc()">Request data</button>

<p id="demo"></p>
 
<script>
function loadDoc() {
  const xhttp = new XMLHttpRequest();
  xhttp.onload = function() {
    document.getElementById("demo").innerHTML = this.responseText;
  }
  xhttp.open("POST", "demo_post2.asp");
  xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  xhttp.send("fname=Henry&lname=Ford");
}
</script>

</body>
</html>
setRequestHeader(header, value)

Adiciona cabeçalhos HTTP à solicitação

cabeçalho: especifica o nome do cabeçalho
valor: especifica o valor do cabeçalho


Solicitação Síncrona

Para executar uma solicitação síncrona, altere o terceiro parâmetro no método open() para false:

xhttp.open("GET", "ajax_info.txt", false);

Às vezes, async=false são usados para testes rápidos. Você também encontrará solicitações síncronas em código JavaScript mais antigo.

Como o código aguardará a conclusão do servidor, não há necessidade de um onreadystatechange função:

Exemplo

xhttp.open("GET", "ajax_info.txt", false);
xhttp.send();
document.getElementById("demo").innerHTML = xhttp.responseText;

Experimente você mesmo →

<!DOCTYPE html>
<html>
<body>

<h2>The XMLHttpRequest Object</h2>

<p id="demo">Let AJAX change this text.</p>

<button type="button" onclick="loadDoc()">Change Content</button>

<script>
function loadDoc() {
  var xhttp = new XMLHttpRequest();
  xhttp.open("GET", "ajax_info.txt", false);
  xhttp.send();
  document.getElementById("demo").innerHTML = xhttp.responseText;
}
</script>

</body>
</html>

XMLHttpRequest síncrono (async=false) não é recomendado porque o JavaScript irá pare de executar até que a resposta do servidor esteja pronta. Se o servidor estiver ocupado ou lento, o o aplicativo irá travar ou parar.

Ferramentas modernas para desenvolvedores são incentivadas a alertar sobre o uso solicitações síncronas e pode gerar uma exceção InvalidAccessError quando isso ocorrer.