Enviando Formulários com Requisição Ajax - JavaScript
Com o objeto FormData
Primeiro, criaremos um arquivo server.js
const http = require("http");
const fs = require("fs");
http.createServer(async (request, response) => {
if (request.url == "/user") {
let body = ""; // buffer para dados recebidos
// recebendo dados da requisição no buffer
for await (const chunk of request) {
body += chunk;
}
// para o parâmetro name
let userName = "";
// para o parâmetro age
let userAge = 0;
// expressão regular para buscar nome e valor do campo do formulário
const exp = /Content-Disposition: form-data; name="([^\"]+)\"\r\n\r\n(\w*)/g;
let formElement;
while ((formElement = exp.exec(body))) {
paramName = formElement[1]; // obtendo o nome do elemento do formulário
paramValue = formElement[2]; // obtendo o valor do elemento do formulário
console.log(paramName, ":", paramValue); // exibindo no console
if (paramName === "name") userName = paramValue;
if (paramName === "age") userAge = paramValue;
}
response.end(`Your name: ${userName} Your Age: ${userAge}`);
} else {
fs.readFile("index.html", (_, data) => response.end(data));
}
}).listen(3000, () => console.log("Servidor iniciado em http://localhost:3000"));
Vamos percorrer rapidamente o código. Primeiro, conectamos os pacotes com funcionalidades que vamos utilizar:
const http = require("http"); // para processar requisições recebidas
const fs = require("fs"); // para ler arquivos do disco rígido
Para criar o servidor, usamos a função http.createServer()
request
response
Na função manipuladora, utilizamos a propriedade request.url
if (request.url == "/user") {
Para obter os valores enviados pelo formulário, lemos o corpo da requisição na variável body
let body = ""; // buffer para dados recebidos
// recebendo dados da requisição no buffer
for await (const chunk of request) {
body += chunk;
}
Para ilustrar o conteúdo de body
name
age
------WebKitFormBoundarya9nLzvDVEN5gPA5Q Content-Disposition: form-data; name="name" Tom ------WebKitFormBoundarya9nLzvDVEN5gPA5Q Content-Disposition: form-data; name="age" 39 ------WebKitFormBoundarya9nLzvDVEN5gPA5Q--
Aqui vemos o marcador de limite ------WebKitFormBoundarya9nLzvDVEN5gPA5Q
Content-Disposition: form-data;
name
name
age
Nossa tarefa é extrair os nomes e valores dos campos do formulário. Para isso, usamos a expressão regular:
const exp = /Content-Disposition: form-data; name="([^\"]+)\"\r\n\r\n(\w*)/g;
Percorremos o corpo da requisição com a expressão regular e extraímos todos os elementos do formulário e seus valores:
while ((formElement = exp.exec(body))) {
paramName = formElement[1]; // obtendo o nome do elemento do formulário
paramValue = formElement[2]; // obtendo o valor do elemento do formulário
if (paramName === "name") userName = paramValue;
if (paramName === "age") userAge = paramValue;
}
Vale notar que esta não é uma análise completa, que não leva em conta muitos aspectos (envio de arrays, arquivos, etc.), sendo usada apenas para demonstrar requisições Ajax.
Depois de obter os dados da requisição, enviamos uma mensagem de resposta ao cliente:
response.end(`Your name: ${userName} Your Age: ${userAge}`);
Finalmente, usamos a função listen()
http://localhost:3000/
Definindo o Cliente
Agora, vamos definir o arquivo index.html
server.js
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<script>
// dados para envio
const formData = new FormData();
formData.append("name", "Tom");
formData.append("age", 39);
const xhr = new XMLHttpRequest();
xhr.onload = () => {
if (xhr.status == 200) {
console.log(xhr.responseText);
} else {
console.log("Resposta do servidor: ", xhr.statusText);
}
};
xhr.open("POST", "user", true);
xhr.send(formData);
</script>
</body>
</html>
Aqui, os dados do formulário são definidos manualmente como um objeto FormData
FormData
append()
FormData
send()
No manipulador onload, exibimos a mensagem recebida do servidor no console.
Finalmente, no console, navegue até a pasta do servidor usando o comando cd
node server.js
C:\app>node server.js Servidor iniciado em http://localhost:3000
Após iniciar o servidor, podemos acessar a página no navegador em http://localhost:3000
/user
No exemplo acima, os dados do formulário são definidos manualmente. No entanto, também podemos enviar dados de formulários definidos no código HTML. Por exemplo, podemos alterar o código da página index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<form id="myForm" method="post" action="/user">
<p>
<label>Nome do Usuário:</label><br>
<input name="name" />
</p>
<p>
<label>Idade do Usuário:</label><br>
<input name="age" />
</p>
<input type="submit" value="Enviar" />
</form>
<script>
// dados para envio
const myForm = document.getElementById("myForm");
myForm.addEventListener("submit", (e) => {
e.preventDefault();
const formData = new FormData(myForm);
const xhr = new XMLHttpRequest();
xhr.onload = () => {
if (xhr.status == 200) {
console.log(xhr.responseText);
}
};
xhr.open("POST", "user", true);
xhr.send(formData);
});
</script>
</body>
</html>
Aqui, o código HTML define um formulário com dois campos de entrada para envio ao servidor. Esses campos também possuem os nomes name
age
FormData