Links vs Formulários em Requisições HTTP
Sempre que um usuário clica em um link de navegação ou envia uma consulta de pesquisa, o navegador faz uma requisição HTTP. Mas qual elemento HTML dispara essa requisição — e como — importa mais do que a maioria dos desenvolvedores percebe. Escolher entre <a> e <form> não é apenas uma preferência de marcação. É uma decisão semântica que afeta comportamento, segurança e correção.
Pontos-Chave
- Links (
<a>) são para navegação e normalmente disparam requisições GET. Formulários (<form>) são para envio de dados e suportam tanto GET quanto POST. - Use formulários GET quando a entrada do usuário molda a URL (como consultas de pesquisa) e formulários POST quando a ação altera o estado do servidor (como criação de conta).
method="link"é HTML inválido — navegadores silenciosamente recorrem ao GET, o que pode levar a comportamentos inesperados.- Formulários HTML suportam apenas GET e POST nativamente. Para PUT, PATCH ou DELETE, use JavaScript.
A Diferença Fundamental: Navegação HTML vs Envio
Links (<a>) são elementos de navegação. Eles dizem ao navegador: “Vá buscar este recurso.” Clicar em um link normalmente dispara uma requisição de navegação GET para a URL no atributo href. É isso. Nenhuma entrada do usuário é coletada, nenhum dado é serializado — apenas um evento de navegação limpo.
Formulários (<form>) são elementos de envio de dados. Eles coletam entrada do usuário e a enviam para um servidor. Um formulário pode usar GET ou POST, dependendo da natureza da requisição.
Aqui está uma comparação rápida:
| Característica | Link <a> | <form> |
|---|---|---|
| Propósito | Navegação | Envio de dados |
| Método HTTP | Apenas GET | GET ou POST |
| Coleta entrada do usuário | Não | Sim |
| Clique direito / abrir em nova aba | Sim | Não |
| Rastreável por SEO | Sim | Limitado |
| Altera estado do servidor | Não | Sim (com POST) |
GET vs POST em Formulários HTML: Quando Usar Cada Um
Use um link para navegação segura e idempotente
Se a ação não altera nada no servidor e o destino pode ser marcado como favorito ou compartilhado, use um link:
<a href="/articles/html-basics">Leia o guia de HTML</a>
Links são seguros, idempotentes e cacheáveis — exatamente o que requisições GET devem ser.
Use um formulário GET quando a entrada do usuário molda a URL
Uma caixa de pesquisa é o exemplo clássico. O usuário digita uma consulta, e o formulário a anexa à URL como uma query string:
<form method="get" action="/search">
<input type="search" name="q" placeholder="Pesquisar...">
<button type="submit">Pesquisar</button>
</form>
Isso produz /search?q=sua+consulta — uma URL compartilhável e que pode ser marcada como favorita. Use formulários GET quando a requisição ainda é segura e idempotente, mas os parâmetros da URL dependem da entrada do usuário.
Use um formulário POST quando a ação tem efeitos colaterais
Criar uma conta, enviar um pagamento ou postar um comentário — tudo isso altera o estado do servidor. Estes pertencem a formulários POST:
<form method="post" action="/register">
<input type="email" name="email">
<input type="password" name="password">
<button type="submit">Criar conta</button>
</form>
POST envia dados no corpo da requisição, não na URL — o que é apropriado para dados sensíveis e ações não-idempotentes.
Discover how at OpenReplay.com.
Um Erro Comum: method="link" Não Existe
Alguns desenvolvedores escrevem <form method="link"> esperando criar um “botão de link.” Isso é HTML inválido. Navegadores ignoram o valor desconhecido e recorrem ao padrão — que é GET. O formulário ainda envia, mas faz isso silenciosamente e incorretamente.
Se você quer um botão que navegue para algum lugar, use um link estilizado como botão — não um formulário:
<!-- ❌ Inválido -->
<form method="link" action="/about">
<input type="submit" value="Ir para Sobre">
</form>
<!-- ✅ Correto -->
<a href="/about" class="btn">Ir para Sobre</a>
Capacidades Modernas de Formulários que Vale a Pena Conhecer
HTML5 adicionou substituições por botão via atributos formaction e formmethod, permitindo que botões de envio individuais alterem onde ou como um formulário envia:
<form method="post" action="/save">
<button type="submit">Salvar</button>
<button type="submit" formaction="/save-and-publish" formmethod="post">Publicar</button>
</form>
Também vale mencionar: requestSubmit() (ao contrário de submit()) dispara a validação do formulário antes do envio, tornando-o a melhor escolha para envio programático de formulários em JavaScript.
Para PUT, PATCH ou DELETE, formulários HTML não suportam esses métodos nativamente. Você precisará de JavaScript (fetch, XMLHttpRequest) ou uma convenção de substituição de método no lado do servidor.
Conclusão
A decisão entre links e formulários é direta uma vez que você entende a semântica:
- Navegando para uma página? Use um link.
- Coletando entrada do usuário para uma consulta? Use um formulário GET.
- Enviando dados que alteram o estado do servidor? Use um formulário POST.
- Executando PUT/PATCH/DELETE? Use JavaScript.
Escolha o elemento que corresponde à intenção da ação. HTML semântico não é apenas sobre correção — é o que torna sua UI previsível, acessível e sustentável.
Perguntas Frequentes
Tecnicamente sim, mas geralmente é a escolha semântica errada. Um formulário GET é projetado para coletar entrada do usuário e anexá-la à URL como parâmetros de query. Para navegação simples sem entrada do usuário, um link é a escolha semântica correta. Links são rastreáveis por mecanismos de busca, suportam menus de contexto de clique direito e comunicam claramente a intenção de navegação tanto para navegadores quanto para tecnologias assistivas.
Navegadores tratam qualquer valor de método não reconhecido como inválido e silenciosamente recorrem ao GET, que é o método padrão de formulário. Então um formulário com method link ainda envia, mas se comporta exatamente como um formulário GET. Isso pode mascarar bugs e produzir comportamento confuso. Sempre use get ou post como valor do método do seu formulário.
O método submit() envia o formulário imediatamente sem executar a validação HTML integrada ou disparar o evento submit. O método requestSubmit() se comporta como um usuário clicando no botão de envio. Ele dispara a validação de restrições primeiro e dispara o evento submit, permitindo que ouvintes de eventos interceptem ou cancelem o envio. Use requestSubmit() quando você precisar que a validação seja executada.
Formulários HTML suportam apenas GET e POST como valores de método. Para enviar requisições DELETE, PUT ou PATCH, você precisa de JavaScript usando fetch ou XMLHttpRequest. Alguns frameworks do lado do servidor também suportam um padrão de substituição de método onde você envia um formulário POST com um campo de entrada oculto que especifica o método HTTP pretendido, que o servidor então interpreta adequadamente.
Gain control over your UX
See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.