Enviando Dados em uma Solicitação AJAX - JavaScript
Para enviar dados ao servidor a partir do código JavaScript em uma solicitação AJAX, os dados são passados ao método send()
XMLHttpRequest
Para testar o envio, assim como em artigos anteriores, usaremos Node.js como servidor, por ser a opção mais simples. Então, criaremos um arquivo server.js
const http = require("http");
const fs = require("fs");
http.createServer(async (request, response) => {
if (request.url === "/user") {
let userName = ""; // recebendo os dados como string
// recebendo os dados da solicitação e adicionando-os à string
for await (const chunk of request) {
userName += chunk;
}
userName += " Smith";
response.end(userName);
} else {
fs.readFile("index.html", (_, data) => response.end(data));
}
}).listen(3000, () => console.log("Servidor iniciado em http://localhost:3000"));
Neste caso, ao acessar o endereço "/user", o servidor recebe todos os dados enviados:
if (request.url === "/user") {
Podemos iterar sobre o objeto da solicitação e assim extrair os dados recebidos:
let userName = ""; // recebendo os dados como string
// recebendo os dados da solicitação e adicionando-os à string
for await (const chunk of request) {
userName += chunk;
}
Aqui, os dados enviados, na forma de objetos chunk, são adicionados à string userName
Além disso, vamos supor que o cliente envie um nome de usuário ao servidor. Para exemplificar, adicionamos um sobrenome ao nome recebido e o enviamos de volta ao cliente:
userName += " Smith";
response.end(userName);
Agora, vamos definir na página index.html o código para enviar dados a este servidor:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<script>
// dados para enviar
const user = "Tom";
const xhr = new XMLHttpRequest();
// manipulador para a resposta do servidor
xhr.onload = () => {
if (xhr.status === 200) {
console.log(xhr.responseText);
} else {
console.log("Resposta do servidor: ", xhr.statusText);
}
};
// solicitação POST ao recurso /user
xhr.open("POST", "/user");
xhr.send(user); // enviando o valor user no método send
</script>
</body>
</html>
Para o envio, é utilizado o método POST. E os dados enviados são uma simples string "Tom". Ou seja, texto simples é enviado ao servidor. Como o servidor também envia texto de volta, usamos a propriedade xhr.responseText
Enviando JSON
De maneira semelhante, é possível enviar dados com uma estrutura mais complexa. Por exemplo, vamos considerar o envio de JSON. Para isso, definimos o seguinte servidor no lado do Node.js:
const http = require("http");
const fs = require("fs");
http.createServer(async (request, response) => {
if (request.url === "/user") {
// obtendo a representação em string da resposta
let data = "";
for await (const chunk of request) {
data += chunk;
}
// esperamos dados do tipo {"name":"value","age":1234}
const user = JSON.parse(data); // parse da string para JSON
// para teste, alteramos os dados do objeto recebido
user.name = user.name + " Smith";
user.age += 1;
// enviamos o objeto alterado de volta ao cliente
response.end(JSON.stringify(user));
} else {
fs.readFile("index.html", (_, data) => response.end(data));
}
}).listen(3000, () => console.log("Servidor iniciado em http://localhost:3000"));
Neste caso, esperamos receber no servidor um objeto JSON com duas propriedades: name
age
Na página web, configuramos um objeto JSON para envio e recebemos os dados de volta:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<script>
// dados para envio
const tom = {
name: "Tom",
age: 37
};
// codificando o objeto em formato JSON
const data = JSON.stringify(tom);
const xhr = new XMLHttpRequest();
xhr.onload = () => {
if (xhr.status === 200) {
const user = JSON.parse(xhr.responseText);
console.log(user.name, "-", user.age);
} else {
console.log("Resposta do servidor: ", xhr.statusText);
}
};
xhr.open("POST", "/user");
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(data);
</script>
</body>
</html>
Aqui, o objeto tom
name
age
JSON.stringify()
const data = JSON.stringify(tom);
Ao enviar, utilizamos o método setRequestHeader()
xhr.setRequestHeader("Content-Type", "application/json");
No manipulador do evento load
const user = JSON.parse(xhr.responseText);
Em seguida, exibimos os dados do objeto recebido no console do navegador: