O atributo action de um formulário HTML diz ao navegador para onde enviar os dados do formulário quando o usuário clica em enviar. É a URL que recebe o envio do formulário, e sem ela, seus dados não têm para onde ir. Entender como funciona é a diferença entre um formulário de contato que realmente entrega mensagens e outro que silenciosamente não faz nada.
Índice de Conteúdo
O que o atributo action realmente faz
Quando um usuário preenche um formulário e clica em enviar, o navegador empacota todos os valores dos campos do formulário em uma requisição e a envia para a URL especificada no atributo
action
. Essa URL é chamada de endpoint do formulário. Qualquer servidor nesse endpoint recebe os dados, processa-os e normalmente retorna uma resposta.
Aqui está o exemplo mais simples possível:
<form action="https://example.com/submit" method="POST">
<input name="name" type="text"/>
<button type="submit">Send</button>
</form>
Quando o usuário clica em "Enviar", o navegador envia uma requisição POST para
https://example.com/submit
com os dados do formulário anexados. O servidor nesse endereço cuida do resto.
Se você omitir o atributo
action
inteiramente, o navegador envia o formulário de volta para a URL da página atual. Isso é ocasionalmente útil para aplicativos renderizados no servidor, mas na maioria dos casos significa que seus dados não vão para lugar algum útil.
O que colocar na URL do formulário
A URL do formulário pode ser:
-
Uma URL absoluta
como
https://api.example.com/contact. Isso envia dados para um servidor ou serviço completamente diferente. -
Uma URL relativa
como
/submitousubmit.php. O navegador resolve isso em relação ao domínio da página atual. -
Uma string vazia
(
action=""). Envia para a página atual, igual a omitir o atributo.
Para a maioria dos formulários de contato do mundo real, você usará uma URL absoluta apontando para seu próprio script do lado do servidor (um arquivo PHP, um endpoint Node.js, etc.) ou um serviço de backend de formulário de terceiros. O requisito chave é que algo precisa estar rodando nessa URL para receber e processar a requisição.
action
é o destino, não o processador. O trabalho real (enviar um email, salvar em um banco de dados, disparar um webhook) acontece em qualquer código que rode nesse endpoint.
Por que o método é tão importante quanto a ação
O atributo
method
funciona junto com
action
para definir como os dados são enviados. Existem duas opções:
| Método | Como os dados são enviados | Uso típico |
|---|---|---|
GET
|
Adicionado à URL como parâmetros de consulta (
?name=Alice&message=Hi
)
|
Formulários de busca, filtros, consultas com bookmark |
POST
|
Enviado no corpo da requisição, não visível na URL | Formulários de contato, formulários de login, qualquer dado sensível ou longo |
Para formulários de contato, sempre use
method="POST"
. Requisições GET expõem valores de campos na barra de endereço do navegador, ficam armazenadas no histórico do navegador e têm limites de comprimento que vão truncar mensagens mais longas. POST não tem nenhum desses problemas.
Por padrão, formulários HTML enviam dados como
application/x-www-form-urlencoded
, que codifica nomes de campos e valores em uma string estruturada. A maioria dos backends de formulário e serviços aceitam esse formato por padrão.
O problema do site estático
Aqui é onde os desenvolvedores batem numa parede. Se seu site é puramente estático (arquivos HTML simples hospedados em GitHub Pages, Cloudflare Pages ou hosts similares), não há código do lado do servidor rodando no seu domínio. Você não pode simplesmente apontar a ação do formulário para um script PHP porque não há runtime PHP para executá-lo.
Isso significa que sua URL de ação do formulário precisa apontar para outro lugar completamente. Suas opções são:
- Escrever e hospedar seu próprio backend API (Node.js, Python, etc.) em um servidor separado
- Usar uma função serverless (AWS Lambda, Cloudflare Workers)
- Usar um serviço de backend de formulário que oferece um endpoint de formulário HTML pronto para usar
A terceira opção é a mais rápida para a maioria dos projetos. Você obtém uma URL para colocar direto no seu atributo
action
e os envios começam a chegar na sua caixa de entrada sem nenhum código de backend. Se você está curioso sobre como isso se compara com escrever seu próprio manipulador do lado do servidor, o
guia comparativo de PHP vs formulários serverless
cobre bem os trade-offs.
Usando um serviço de endpoint de formulário
Um serviço de endpoint de formulário como Sendform.net funciona oferecendo uma URL única que atua como o atributo action do seu formulário. Você aponta seu formulário para lá, e o serviço encaminha os envios para seu email. Nenhum backend necessário.
Aqui está como funciona na prática:
<form action="https://sendform.net/en/!a8Kz3mXq12" method="POST">
<input name="email" placeholder="[email protected]" required="" type="email"/>
<textarea name="message" placeholder="Tell us more" required=""></textarea>
<button type="submit">Send</button>
</form>
A configuração é simples:
- Faça login no Sendform.net e crie um formulário para obter sua URL de endpoint pessoal.
- Abra a aba Integração e copie o endpoint.
-
Cole como o atributo
actiondo seu formulário commethod="POST". -
Certifique-se de que seu formulário tem um
<input/>comname="email"e um<textarea> </textarea>comname="message". - Implante seu site. Os envios chegam na sua caixa de entrada de notificações.
email
e
message
precisam corresponder exatamente. Se seu campo é chamado
Email
(com E maiúscula) ou
msg
, o envio falhará na validação. Os nomes de campos diferenciam maiúsculas de minúsculas.
Sendform também tem um Construtor de Snippet na aba Integração. Selecione "HTML" no seletor de framework, opcionalmente defina uma URL de redirecionamento para uma página de agradecimento personalizada, e ative um campo honeypot para proteção básica contra spam. Ele gera o snippet de formulário completo pronto para copiar.
O atributo formaction em botões
Existe um primo menos conhecido do atributo action do formulário:
formaction
em botões de envio individuais. Ele substitui o
action
do formulário apenas para esse botão específico.
<form action="/default-endpoint" method="POST">
<input name="query" type="text">
<button type="submit">Save</button>
<button formaction="/preview-endpoint" type="submit">Preview</button>
</input></form>
Clicar em "Salvar" envia dados para
/default-endpoint
. Clicar em "Visualizar" envia os mesmos dados para
/preview-endpoint
em vez disso. O atributo HTML
formaction
é suportado em todos os navegadores modernos e está definido no
padrão HTML vivo do WHATWG.
Isso é útil para formulários com múltiplas ações (salvar vs. publicar, salvar vs. deletar) sem precisar de JavaScript para trocar a ação do formulário dinamicamente.
O que acontece após o envio
Depois que o navegador envia a requisição para a URL de ação do formulário, a resposta do servidor determina o que o usuário vê a seguir:
- Resposta de redirecionamento (HTTP 302/303): O servidor envia o navegador para uma nova URL. Padrão comum para mostrar uma página de "obrigado".
- Resposta HTML: O servidor retorna uma página diretamente, que substitui a página atual no navegador.
- Nenhum redirecionamento configurado: Com Sendform, se você não definiu uma URL de redirecionamento, o serviço retorna sua própria página de confirmação.
Se você quer manter o usuário no seu site após o envio, configure uma URL de redirecionamento apontando para sua página de agradecimento. No Sendform, você define isso no Construtor de Snippet ou nas configurações do formulário. O navegador vai pousar na sua página em vez da tela de confirmação padrão do serviço.
Para desenvolvedores que querem lidar com envios sem um recarregamento completo da página, você pode interceptar o envio do formulário com JavaScript, enviar os dados via
fetch()
, e atualizar a interface você mesmo. Nesse caso, o atributo
action
ainda serve como um fallback útil para usuários com JavaScript desativado.
Erros comuns
- Usar GET em vez de POST para formulários de contato. Valores de campos, incluindo endereços de email, acabam em logs de servidor e histórico do navegador.
- Apontar a ação para um arquivo estático. Arquivos HTML e CSS não podem processar envios de formulário. A URL de ação precisa de um servidor ou serviço por trás dela.
- Esquecer o atributo action inteiramente. O formulário envia de volta para a página atual, o que normalmente apenas a recarrega sem efeito.
-
Nomes de campos não correspondentes.
Se o endpoint espera
name="email"e seu input temname="Email", o envio falha na validação silenciosamente no lado do servidor. - Usar uma URL relativa para um endpoint de origem cruzada. Se seu backend de formulário vive em um domínio diferente, você precisa da URL absoluta completa incluindo o protocolo.
Para usuários do Webflow especificamente, a configuração da ação do formulário tem algumas peculiaridades específicas da plataforma que valem a pena conhecer. O guia de formulário de contato do Webflow cobre como apontar um formulário do Webflow para um endpoint externo sem escrever código do lado do servidor.
Obtenha uma URL real de ação de formulário HTML em menos de um minuto
Sendform.net oferece um endpoint de formulário HTML pronto para usar que você pode colocar direto no atributo action do seu formulário. Sem backend, sem JavaScript necessário. Aponte seu formulário de site estático para seu endpoint pessoal e os envios chegam na sua caixa de entrada instantaneamente.
Criar Seu Endpoint de Formulário →
Se você omitir o atributo
action
ou defini-lo como uma string vazia, o navegador envia o formulário para a URL da página atual. Em uma página HTML estática sem código do lado do servidor, isso normalmente apenas recarrega a página e descarta os dados inteiramente. Nada é salvo ou enviado por email. Sempre aponte
action
para um endpoint real que possa processar o envio.
Sim. Você pode interceptar o evento submit do formulário com JavaScript, chamar
event.preventDefault()
, coletar os valores dos campos usando
FormData
, e enviá-los para a URL de ação via
fetch()
. Isso permite mostrar uma mensagem de sucesso sem sair da página. O atributo
action
ainda atua como um fallback confiável para usuários com JavaScript desativado, então é uma boa prática mantê-lo definido corretamente de qualquer forma.
Não. A URL de ação do formulário pode apontar para qualquer domínio. Um envio de formulário tradicional (não usando fetch) envia a requisição diretamente do navegador e não é restrito pela política de mesma origem que se aplica a requisições fetch de JavaScript. É exatamente assim que os serviços de backend de formulário funcionam: seu formulário vive no seu domínio, mas a URL de ação aponta para o domínio do serviço, e o navegador envia os dados para lá sem nenhum problema de CORS.
O atributo
action
no elemento
<form>
</form>
define a URL de envio padrão para o formulário inteiro. O atributo
formaction
em um
<button type="submit">
</button>
ou
<input type="submit"/>
individual substitui esse padrão apenas para esse botão específico. Quando o usuário clica em um botão com
formaction
, o formulário envia para a URL desse botão em vez do padrão do formulário. Todos os outros botões ainda usam o
action
do nível do formulário.
A maioria dos serviços de backend de formulário, incluindo Sendform.net, permite configurar uma URL de redirecionamento nas configurações do formulário. Após um envio bem-sucedido, o serviço envia uma resposta de redirecionamento HTTP apontando o navegador para a URL escolhida, como
/thank-you.html
. Sem uma URL de redirecionamento configurada, o serviço retorna sua própria página de confirmação padrão. Defina o redirecionamento no Construtor de Snippet ou no painel de configurações do formulário antes de implantar seu formulário.
Isso normalmente acontece quando a ação do formulário aponta para um servidor local (como
http://localhost:3000/submit
) que não existe em produção. Após a implantação, esse endereço é inacessível. Certifique-se de que seu atributo action usa uma URL absoluta apontando para seu endpoint ativo, não um endereço localhost. Também verifique duplo que qualquer configuração específica do ambiente (chaves de API, URLs de endpoint) está corretamente definida na sua plataforma de hospedagem.