AULA 05 / 61 · ACESSO GRATUITO

Página navegador interação e comunicação com o servidor

Graciliano TolentinoEngenharia Caracol · Edição 2.0
Nesta aula
  1. As partes de uma página
  2. Ler uma implementação curta
  3. Do arquivo local ao serviço HTTP
  4. Prática por teclado e exercício resolvido

As partes de uma página

Uma página web combina estrutura, apresentação e comportamento. HTML descreve os elementos, CSS define sua apresentação e JavaScript responde a ações ou transforma informações. São papéis complementares. Um botão que parece correto pode não realizar a ação esperada; um teste de cálculo pode passar sem que o botão esteja acessível.

Abra 05_pagina.html no navegador. Este laboratório é um arquivo local independente, sem servidor. Ele serve para estudar uma interação pequena. O catálogo principal será aberto pelo endereço local fornecido por npm start; não substitua esse passo por abrir seu index.html diretamente, pois a interface precisa conversar com a API.

Duas faixas separam GET de POST. GET consulta o catálogo e devolve registros públicos. POST envia chave e casoId a um registrador em memória e devolve a resposta da simulação.Ampliar diagrama
Leitura pública e operação simulada. O estado temporário das reservas pertence ao registrador; a leitura do catálogo não cria reserva. O projeto não representa um sistema real de agendamento.

Ler uma implementação curta

html
<!doctype html>
<html lang="pt-BR">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Primeira interação Caracol</title>
  <style>
    body { font: 1.1rem sans-serif; margin: 2rem; max-width: 42rem; }
    button { padding: .7rem 1rem; font: inherit; }
    button:focus-visible { outline: 3px solid #005fcc; outline-offset: 3px; }
  </style>
</head>
<body>
  <h1>Contador de consultas de exemplo</h1>
  <p>Ative o botão com mouse ou teclado.</p>
  <button id="consultar" type="button">Registrar consulta</button>
  <p id="estado" role="status">Consultas registradas 0</p>
  <script>
    let total = 0;
    const botao = document.querySelector('#consultar');
    const estado = document.querySelector('#estado');
    botao.addEventListener('click', () => {
      total = total + 1;
      estado.textContent = 'Consultas registradas ' + total;
    });
  </script>
</body>
</html>

O atributo lang identifica o idioma da página. meta charset informa a codificação. viewport orienta a apresentação em telas menores. title nomeia a aba; h1 apresenta o título do conteúdo. O elemento button já possui comportamento de teclado que seria necessário recriar ao usar um elemento genérico como botão.

O CSS controla tamanho e espaçamento e torna o foco visível. Foco é o elemento que receberá a próxima ação de teclado. role="status" identifica uma região de atualização que tecnologias assistivas podem anunciar; sua presença isolada não certifica a acessibilidade da página. A leitura com diferentes recursos precisa ser verificada no contexto real.

No script, document.querySelector encontra os elementos por identificador. addEventListener associa uma função à ação click. A expressão () => introduz uma função sem nome nessa posição. A função só é executada quando ocorre o evento. textContent atualiza texto, evitando interpretar o conteúdo como marcação HTML. Nesse laboratório, total existe apenas enquanto a página permanece aberta. Recarregar reinicia a contagem.

Do arquivo local ao serviço HTTP

HTTP é o protocolo usado na troca de mensagens entre a interface e o servidor do projeto. A interface envia uma requisição; o servidor interpreta método e caminho e devolve status, cabeçalhos e corpo. API é uma fronteira programável que permite a outra parte usar um comportamento por um contrato.

Requisição do projetoFinalidadeResultado esperado
GET /api/casosConsultar casos ativos.200 e array público; [] é catálogo vazio válido.
POST /api/reservasSimular reserva de um caso ativo.200 na primeira reserva e na repetição da mesma chave e caso; 409 para a mesma chave com outro caso.
Caminho desconhecidoPedir um recurso inexistente.404 sem expor arquivos privados.

JSON é um formato de texto para dados. Sua sintaxe exige aspas duplas nos nomes de propriedades e não admite comentários comuns de JavaScript. Ao receber JSON, o programa ainda precisa verificar tipos e regras. Um documento bem formado pode conter um id duplicado ou um booleano escrito como texto.

Uma requisição demora um tempo que varia. Promise representa um resultado futuro; await permite aguardar esse resultado dentro de uma função async. A interface precisa mostrar carregamento, sucesso vazio, sucesso com dados e falha. A existência de uma resposta não significa sucesso: uma resposta HTTP 500 também chega ao navegador e precisa ser tratada.

Prática por teclado e exercício resolvido

No laboratório, use Tab para chegar ao botão. Observe o foco e use Enter ou espaço para ativá-lo. A contagem deve mudar uma vez por ativação. Depois recarregue. O retorno a zero é esperado neste exemplo em memória, não é prova de persistência. Anote navegador, ação e resultado; não declare conformidade com toda a WCAG a partir desses passos.

Exercício: uma pessoa clica três vezes, recarrega e ativa uma vez por teclado. Qual valor deve aparecer ao final?

Ver solução comentada

Solução: 1, porque o recarregamento criou uma nova execução do script. Se a necessidade fosse conservar o total entre sessões, seria preciso definir armazenamento, autorização, tratamento de falhas e testes apropriados.

Você pode avançar quando distingue texto de dados, cálculo de interface e estado local de estado no servidor. No projeto principal, verifique separadamente a resposta da API e o que a pessoa consegue fazer na tela; uma não substitui a outra.

Fontes relacionadas

Consulte os limites e as seções de apoio de cada referência.

S18 S19 S06
Conseguiu explicar o que aprendeu?

Tente o exercício antes de consultar a solução. Marque a aula para organizar sua leitura.

A conclusão desta leitura não equivale a certificação ou aceite de um projeto real. Teste os exemplos no escopo indicado e registre as limitações.