Médio JavaScript
Enviando dados com POST e JSON
Enunciado
Crie uma função criarPost(titulo, corpo) que envia uma requisição POST para https://jsonplaceholder.typicode.com/posts com um objeto JSON contendo title, body e userId: 1. Exiba o ID do post criado. Trate erros de status e de rede.
Requisitos
- Usar
fetchcom métodoPOST. - Definir o cabeçalho
Content-Type: application/json. - Usar
JSON.stringify()para converter o objeto em string JSON no corpo. - Verificar
response.oke lançar erro se necessário. - Exibir
Post criado com ID: [id]no console.
Código inicial
async function criarPost(titulo, corpo) {
// Seu código aqui
}
criarPost('Meu título', 'Conteúdo do post');
Saída esperada
Post criado com ID: 101
Ver dica
No fetch, passe um objeto de opções com method: 'POST', headers e body. Não esqueça de converter o objeto para string com JSON.stringify.
Mostrar solução
async function criarPost(titulo, corpo) {
const dados = {
title: titulo,
body: corpo,
userId: 1
};
try {
const resposta = await fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(dados)
});
if (!resposta.ok) {
throw new Error(`Erro HTTP: ${resposta.status}`);
}
const postCriado = await resposta.json();
console.log(`Post criado com ID: ${postCriado.id}`);
} catch (erro) {
console.error('Erro ao criar post:', erro.message);
}
}
criarPost('Meu título', 'Conteúdo do post');
Passo a passo
- Montamos um objeto
dadoscom as propriedadestitle,bodyeuserId. - Chamamos
fetchcom a URL e um objeto de configuração:method: 'POST', cabeçalhoContent-Type: application/jsonebodycomo string JSON. - Usamos
JSON.stringify(dados)para converter o objeto em string, pois o corpo da requisição deve ser texto. - Verificamos
resposta.ok; se não for ok, lançamos um erro com o status. - Convertemos a resposta para objeto com
await resposta.json(). - Exibimos o ID do post criado.
- O
catchcaptura erros de rede ou o erro lançado.
Por que funciona
O fetch permite enviar dados no corpo da requisição. Para APIs que esperam JSON, é necessário definir o cabeçalho Content-Type: application/json e enviar uma string JSON. O JSON.stringify faz essa conversão. A resposta da API geralmente retorna o objeto criado com um ID, que exibimos.
Erros comuns
- Esquecer o cabeçalho
Content-Type: a API pode não interpretar o corpo como JSON e retornar erro 400. - Enviar o objeto diretamente no
body: o corpo deve ser string; semJSON.stringify, ofetchconverterá para[object Object]. - Não verificar
resposta.ok: mesmo com status 201 (Created),okétrue, mas se houver erro 400, você precisa tratar.
Outra forma de resolver
Usar uma função auxiliar para requisições:
async function postJSON(url, dados) {
const resposta = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(dados)
});
if (!resposta.ok) throw new Error(`Erro HTTP: ${resposta.status}`);
return resposta.json();
}
async function criarPost(titulo, corpo) {
try {
const post = await postJSON('https://jsonplaceholder.typicode.com/posts', {
title: titulo,
body: corpo,
userId: 1
});
console.log(`Post criado com ID: ${post.id}`);
} catch (erro) {
console.error('Erro ao criar post:', erro.message);
}
}
Essa forma é preferível quando você faz várias requisições POST e quer reutilizar código.
Saída esperada
Post criado com ID: 101