Criar Requisições AJAX com XMLHttpRequest

HTMLBeginner
Pratique Agora

Introdução

Neste laboratório, os participantes explorarão o poderoso mundo do AJAX (Asynchronous JavaScript and XML) e aprenderão a criar aplicações web dinâmicas utilizando XMLHttpRequest. Este tutorial abrangente cobre os conceitos fundamentais da comunicação web assíncrona, guiando os aprendizes através do processo de envio e recebimento de dados de servidores sem recarregar a página.

Os participantes adquirirão habilidades práticas na criação de objetos XMLHttpRequest, na configuração de métodos de requisição HTTP, no tratamento de estados de resposta do servidor e na implementação de técnicas básicas de recuperação de dados AJAX. Ao compreender estes princípios centrais, os desenvolvedores estarão equipados para construir experiências web mais responsivas e interativas, que aprimoram o envolvimento do usuário e o desempenho da aplicação.

Entenda AJAX e Requisições Assíncronas

Neste passo, você aprenderá sobre AJAX (Asynchronous JavaScript and XML) e como ele revoluciona a comunicação web. AJAX permite que páginas web atualizem o conteúdo dinamicamente sem recarregar a página inteira, criando uma experiência de usuário mais suave e responsiva.

O que é AJAX?

AJAX é uma técnica de desenvolvimento web que permite que aplicações web enviem e recebam dados de um servidor de forma assíncrona (em segundo plano) sem interferir na exibição e no comportamento da página existente. Isso significa que você pode atualizar partes de uma página web sem atualizar a página inteira.

Características Chave das Requisições Assíncronas

  1. Não Bloqueante (Non-Blocking): Ao contrário das requisições síncronas tradicionais, AJAX permite que o navegador continue executando outras tarefas enquanto espera pela resposta do servidor.
  2. Comunicação em Segundo Plano (Background Communication): Os dados podem ser trocados com o servidor sem interromper a interação atual do usuário.
  3. Atualizações Parciais da Página (Partial Page Updates): Apenas partes específicas de uma página web podem ser atualizadas, melhorando o desempenho e a experiência do usuário.

Demonstração Simples do Conceito AJAX

Vamos criar um arquivo HTML simples para ilustrar o conceito de requisições assíncronas. Usaremos o WebIDE para criar este exemplo.

Abra o WebIDE e crie um novo arquivo ~/project/ajax-demo.html:

<!doctype html>
<html>
  <head>
    <title>Demonstração AJAX</title>
  </head>
  <body>
    <h1>Exemplo AJAX</h1>
    <button id="loadData">Carregar Dados</button>
    <div id="result"></div>

    <script>
      document
        .getElementById("loadData")
        .addEventListener("click", function () {
          console.log("Botão clicado: Iniciando requisição AJAX");
          // Requisição assíncrona será implementada em passos posteriores
        });
    </script>
  </body>
</html>

Casos de Uso AJAX no Mundo Real

  • Sugestões de pesquisa de preenchimento automático (autocomplete)
  • Atualizações de conteúdo em tempo real
  • Envio de formulários sem recarregar a página
  • Verificação (polling) de novas notificações
  • Obtenção de dados de APIs

Por que as Requisições Assíncronas Importam

As requisições assíncronas resolvem vários desafios de desenvolvimento web:

  • Melhor experiência do usuário
  • Redução da carga do servidor
  • Aplicações web mais rápidas e responsivas
  • Troca de dados mais eficiente

Criar Objeto XMLHttpRequest

Neste passo, você aprenderá como criar um objeto XMLHttpRequest, que é o mecanismo central para fazer requisições assíncronas em JavaScript. Vamos construir sobre o arquivo HTML do passo anterior e adicionar a funcionalidade XMLHttpRequest.

Abra o arquivo ~/project/ajax-demo.html no WebIDE e atualize a seção de script para criar um objeto XMLHttpRequest:

<!doctype html>
<html>
  <head>
    <title>Demonstração XMLHttpRequest</title>
  </head>
  <body>
    <h1>Exemplo de Requisição AJAX</h1>
    <button id="loadData">Carregar Dados</button>
    <div id="result"></div>

    <script>
      document
        .getElementById("loadData")
        .addEventListener("click", function () {
          // Criar objeto XMLHttpRequest
          var xhr = new XMLHttpRequest();

          // Registrar a criação do objeto XMLHttpRequest
          console.log("Objeto XMLHttpRequest criado:", xhr);
        });
    </script>
  </body>
</html>

Entendendo o Objeto XMLHttpRequest

O objeto XMLHttpRequest (XHR) é uma API de navegador integrada que permite que você:

  • Crie requisições HTTP
  • Envie dados para um servidor
  • Receba dados de um servidor
  • Atualize partes de uma página web sem recarregar

Métodos Chave do XMLHttpRequest

  1. open(): Inicializa uma nova requisição
  2. send(): Envia a requisição para o servidor
  3. onreadystatechange: Acompanha o estado da requisição

XMLHttpRequest é suportado em todos os navegadores modernos, tornando-o uma escolha confiável para comunicações AJAX. O desenvolvimento web moderno também utiliza a Fetch API, mas XMLHttpRequest continua sendo amplamente utilizado.

Exemplo de Saída

Quando você clicar no botão "Carregar Dados", verá um registro no console demonstrando a criação do objeto XMLHttpRequest:

Objeto XMLHttpRequest criado: XMLHttpRequest {...}

Configurar Métodos de Requisição HTTP

Neste passo, você aprenderá como configurar métodos de requisição HTTP usando XMLHttpRequest. Vamos atualizar o arquivo ajax-demo.html para demonstrar como configurar diferentes tipos de requisições HTTP.

Abra o arquivo ~/project/ajax-demo.html no WebIDE e modifique a seção de script:

<!doctype html>
<html>
  <head>
    <title>Métodos de Requisição HTTP</title>
  </head>
  <body>
    <h1>Métodos de Requisição AJAX</h1>
    <button id="getButton">Requisição GET</button>
    <button id="postButton">Requisição POST</button>
    <div id="result"></div>

    <script>
      // Configuração da Requisição GET
      document
        .getElementById("getButton")
        .addEventListener("click", function () {
          var xhr = new XMLHttpRequest();

          // Configurar requisição GET
          xhr.open("GET", "https://jsonplaceholder.typicode.com/posts/1", true);

          // Definir cabeçalhos da requisição
          xhr.setRequestHeader("Content-Type", "application/json");

          // Registrar detalhes da requisição
          console.log("Requisição GET Configurada");

          // Enviar a requisição
          xhr.send();
        });

      // Configuração da Requisição POST
      document
        .getElementById("postButton")
        .addEventListener("click", function () {
          var xhr = new XMLHttpRequest();

          // Configurar requisição POST
          xhr.open("POST", "https://jsonplaceholder.typicode.com/posts", true);

          // Definir cabeçalhos da requisição
          xhr.setRequestHeader("Content-Type", "application/json");

          // Preparar dados para enviar
          var data = JSON.stringify({
            title: "foo",
            body: "bar",
            userId: 1
          });

          // Registrar detalhes da requisição
          console.log("Requisição POST Configurada");

          // Enviar a requisição com dados
          xhr.send(data);
        });
    </script>
  </body>
</html>

Métodos de Requisição HTTP

Os métodos de requisição HTTP mais comuns são:

  1. GET: Recuperar dados de um servidor
  2. POST: Enviar dados para serem processados pelo servidor
  3. PUT: Atualizar dados existentes
  4. DELETE: Remover dados

Métodos Chave para Configurar Requisições

  • open(method, url, async):

    • method: Método HTTP (GET, POST, etc.)
    • url: Endpoint do servidor
    • async: Booleano para requisição assíncrona (geralmente true)
  • setRequestHeader(): Definir cabeçalhos da requisição

  • send(): Enviar a requisição (com dados opcionais)

Exemplo de Saída

Quando você clicar nos botões, verá os registros no console:

Requisição GET Configurada
Requisição POST Configurada

Gerenciar Estados da Resposta do Servidor

Neste passo, você aprenderá como lidar com diferentes estados de um XMLHttpRequest e processar as respostas do servidor. Vamos atualizar o arquivo ajax-demo.html para demonstrar o tratamento de respostas.

Abra o arquivo ~/project/ajax-demo.html no WebIDE e modifique a seção de script:

<!doctype html>
<html>
  <head>
    <title>Tratamento da Resposta do Servidor</title>
  </head>
  <body>
    <h1>Estados da Resposta AJAX</h1>
    <button id="fetchData">Obter Dados</button>
    <div id="result"></div>

    <script>
      document
        .getElementById("fetchData")
        .addEventListener("click", function () {
          var xhr = new XMLHttpRequest();
          var resultDiv = document.getElementById("result");

          // Acompanhar os estados da requisição
          xhr.onreadystatechange = function () {
            // Registrar o estado atual de prontidão
            console.log("Ready State:", xhr.readyState);

            // Verificar se a requisição está completa e bem-sucedida
            if (xhr.readyState === 4) {
              if (xhr.status === 200) {
                // Resposta bem-sucedida
                try {
                  var data = JSON.parse(xhr.responseText);
                  resultDiv.innerHTML = `
                                <h3>Dados Recebidos:</h3>
                                <pre>${JSON.stringify(data, null, 2)}</pre>
                            `;
                  console.log("Requisição Bem-sucedida");
                } catch (error) {
                  resultDiv.innerHTML = "Erro ao analisar a resposta";
                  console.error("Erro de Análise:", error);
                }
              } else {
                // Tratamento de erros
                resultDiv.innerHTML = `Erro: ${xhr.status}`;
                console.error("Requisição Falhou", xhr.status);
              }
            }
          };

          // Configurar e enviar a requisição
          xhr.open("GET", "https://jsonplaceholder.typicode.com/posts/1", true);
          xhr.send();
        });
    </script>
  </body>
</html>

Estados de Prontidão do XMLHttpRequest

XMLHttpRequest possui 5 estados de prontidão:

  • 0: UNSENT (requisição não inicializada)
  • 1: OPENED (conexão estabelecida)
  • 2: HEADERS_RECEIVED (requisição recebida)
  • 3: LOADING (processando requisição)
  • 4: DONE (requisição completa)

Conceitos Chave do Tratamento de Respostas

  1. Use onreadystatechange para acompanhar o progresso da requisição
  2. Verifique readyState === 4 para requisições completas
  3. Verifique status === 200 para respostas bem-sucedidas
  4. Use responseText ou responseXML para acessar os dados
  5. Implemente o tratamento de erros para diferentes códigos de status

Exemplo de Saída

Quando você clicar em "Obter Dados", verá os registros no console:

Ready State: 1
Ready State: 2
Ready State: 3
Ready State: 4
Requisição Bem-sucedida

Implementar a Recuperação Básica de Dados AJAX

Neste passo, você aprenderá como recuperar e exibir dados de uma API usando AJAX. Criaremos um aplicativo simples de gerenciamento de usuários que busca e exibe informações do usuário.

Abra o arquivo ~/project/ajax-demo.html no WebIDE e substitua seu conteúdo pelo seguinte código:

<!doctype html>
<html>
  <head>
    <title>Aplicativo de Gerenciamento de Usuários</title>
    <style>
      #userList {
        margin-top: 20px;
        border: 1px solid #ddd;
        padding: 10px;
      }
    </style>
  </head>
  <body>
    <h1>Gerenciamento de Usuários</h1>
    <button id="fetchUsers">Obter Usuários</button>
    <div id="userList"></div>

    <script>
      document
        .getElementById("fetchUsers")
        .addEventListener("click", function () {
          var xhr = new XMLHttpRequest();
          var userListDiv = document.getElementById("userList");

          xhr.onreadystatechange = function () {
            if (xhr.readyState === 4) {
              if (xhr.status === 200) {
                try {
                  var users = JSON.parse(xhr.responseText);

                  // Limpar o conteúdo anterior
                  userListDiv.innerHTML = "<h2>Lista de Usuários</h2>";

                  // Criar lista de usuários
                  users.forEach(function (user) {
                    var userDiv = document.createElement("div");
                    userDiv.innerHTML = `
                                    <p>
                                        <strong>Nome:</strong> ${user.name}<br>
                                        <strong>Email:</strong> ${user.email}<br>
                                        <strong>Empresa:</strong> ${user.company.name}
                                    </p>
                                `;
                    userListDiv.appendChild(userDiv);
                  });
                } catch (error) {
                  userListDiv.innerHTML =
                    "Erro ao analisar os dados do usuário";
                }
              } else {
                userListDiv.innerHTML = `Erro ao obter usuários: ${xhr.status}`;
              }
            }
          };

          // Obter usuários da API JSONPlaceholder
          xhr.open("GET", "https://jsonplaceholder.typicode.com/users", true);
          xhr.send();
        });
    </script>
  </body>
</html>

Conceitos Chave da Recuperação de Dados

  1. Use uma API pública (JSONPlaceholder) para demonstração
  2. Obtenha múltiplos registros de usuários
  3. Analise a resposta JSON
  4. Crie dinamicamente elementos HTML
  5. Lide com possíveis erros

Exemplo de Saída

Quando você clicar em "Obter Usuários", verá uma lista de usuários com seus detalhes:

Lista de Usuários
Nome: Leanne Graham
Email: Sincere@april.biz
Empresa: Romaguera-Crona

Nome: Ervin Howell
Email: Shanna@melissa.tv
Empresa: Deckow-Crist

... (mais usuários)

Melhores Práticas

  • Sempre valide e sanitize os dados
  • Implemente o tratamento de erros
  • Use try-catch para análise JSON
  • Crie uma interface de usuário dinâmica e responsiva

Resumo

Neste laboratório, os participantes exploram os fundamentos do AJAX e da comunicação web assíncrona, aprendendo como criar experiências web dinâmicas sem recarregamentos completos da página. O laboratório introduz conceitos-chave como requisições não bloqueantes, troca de dados em segundo plano e atualizações parciais da página, demonstrando como XMLHttpRequest permite uma interação perfeita entre clientes web e servidores.

Ao percorrer exemplos práticos e entender os princípios básicos do AJAX, os alunos obtêm insights sobre a implementação de aplicativos web responsivos que podem buscar e exibir dados dinamicamente. O laboratório cobre técnicas essenciais para criar objetos XMLHttpRequest, configurar métodos HTTP, lidar com respostas do servidor e recuperar dados de forma assíncrona, fornecendo uma base abrangente para as práticas modernas de desenvolvimento web.