Um formulário HTML faz com que o navegador atualize a página ou navegue para uma nova. Ao invés disso, para enviar dados de formulário para um endpoint de API, você deve interceptar o envio do formulário usando JavaScript.
Esta receita mostra como enviar dados de formulário para um endpoint de API e lidar com esses dados.
Crie um componente de formulário usando seu framework de UI. Cada input deve ter um atributo name
que descreve o valor daquele input.
Tenha certeza de incluir um elemento <button>
ou <input type="submit">
para enviar o formulário.
export default function Formulario () {
< input type = " text " id = " nome " name = " nome " required />
< input type = " email " id = " email " name = " email " required />
< textarea id = " mensagem " name = " mensagem " required />
export default function Formulario () {
< input type = " text " id = " nome " name = " nome " required />
< input type = " email " id = " email " name = " email " required />
< textarea id = " mensagem " name = " mensagem " required />
export default function Formulario () {
< input type = " text " id = " nome " name = " nome " required />
< input type = " email " id = " email " name = " email " required />
< textarea id = " mensagem " name = " mensagem " required />
< input type = " text " id = " nome " name = " nome " required />
< input type = " email " id = " email " name = " email " required />
< textarea id = " mensagem " name = " mensagem " required />
< input type = " text " id = " nome " name = " nome " required />
< input type = " email " id = " email " name = " email " required />
< textarea id = " mensagem " name = " mensagem " required / >
Crie um endpoint de API POST
que receberá os dados do formulário. Use request.formData()
para processá-lo. Tenha certeza de validar os valores do formulário antes de usá-los.
Esse exemplo envia um objeto JSON com uma mensagem de volta para o cliente.
import type { APIRoute } from " astro " ;
export const post : APIRoute = async ( { request } ) => {
const dados = await request . formData () ;
const nome = dados . get ( " nome " ) ;
const email = dados . get ( " email " ) ;
const mensagem = dados . get ( " mensagem " ) ;
// Valide os dados - você provavelmente vai querer fazer mais do que isso
if ( ! nome || ! email || ! mensagem) {
message: " Preencha todos os campos obrigatórios " ,
// Faça algo com os dados, e então retorne uma resposta de sucesso
Crie uma função que aceita um evento submit, então passe-a como um manipulador de evento submit
para o seu formulário. Na função, chame preventDefault
no evento para sobrepor o processo de envio padrão do navegador.
Então, crie um objeto FormData
e envie-o para seu endpoint usando fetch
.
import { useState } from " preact/hooks " ;
export default function Formulario () {
const [ respostaMensagem , setRespostaMensagem ] = useState ( "" );
async function submit ( e : SubmitEvent ) {
const formData = new FormData (e . target as HTMLFormElement );
const resposta = await fetch ( " /api/feedback " , {
const dados = await resposta . json ();
setRespostaMensagem (data . mensagem );
< input type = " text " id = " nome " name = " nome " required />
< input type = " email " id = " email " name = " email " required />
< textarea id = " mensagem " name = " mensagem " required />
{ respostaMensagem && < p > { respostaMensagem } </ p > }
import { useState } from " react " ;
export default function Formulario () {
const [ respostaMensagem , setRespostaMensagem ] = useState ( "" );
async function submit ( e : SubmitEvent ) {
const formData = new FormData (e . target as HTMLFormElement );
const resposta = await fetch ( " /api/feedback " , {
const dados = await resposta . json ();
setRespostaMensagem (dados . mensagem );
< input type = " text " id = " nome " name = " nome " required />
< input type = " email " id = " email " name = " email " required />
< textarea id = " mensagem " name = " mensagem " required />
{ respostaMensagem && < p > { respostaMensagem } </ p > }
import { createSignal, createResource, Suspense } from " solid-js " ;
async function postFormData ( formData : FormData ) {
const resposta = await fetch ( " /api/feedback " , {
const dados = await resposta . json ();
export default function Form () {
const [ formData , setFormData ] = createSignal < FormData > ();
const [ resposta ] = createResource (formData , postFormData);
function submit ( e : SubmitEvent ) {
setFormData ( new FormData (e . target as HTMLFormElement ));
< input type = " text " id = " nome " name = " nome " required />
< input type = " email " id = " email " name = " email " required />
< textarea id = " mensagem " name = " mensagem " required />
< Suspense > { response () && < p > { response () . mensagem } </ p > } </ Suspense >
let respostaMensagem : string ;
async function submit ( e : SubmitEvent ) {
const formData = new FormData (e . currentTarget as HTMLFormElement );
const resposta = await fetch ( " /api/feedback " , {
const dados = await resposta . json ();
respostaMensagem = dados . mensagem ;
< form on :submit= { submit } >
< input type = " text " id = " nome " name = " nome " required />
< input type = " email " id = " email " name = " email " required />
< textarea id = " mensagem " name = " mensagem " required />
< p > { respostaMensagem } </ p >
import { ref } from " vue " ;
const respostaMensagem = ref < string > ();
async function submit ( e : Event ) {
const formData = new FormData (e . currentTarget as HTMLFormElement );
const resposta = await fetch ( " /api/feedback " , {
const dados = await resposta . json ();
respostaMensagem . value = dados . mensagem ;
< input type = " text " id = " nome " name = " nome " required />
< input type = " email " id = " email " name = " email " required />
< textarea id = " mensagem " name = " mensagem " required / >
< p v-if = " respostaMensagem " > {{ respostaMensagem }} </ p >
Recipes