Respostas JSON
Parte da seção Fundamentos de Express do Journey de Node.js da Coddy. Lição 6 de 23.
Um programa que chama seu servidor precisa de dados que possa ler, não de uma frase.
app.get('/api/weather', (req, res) => {
res.json({ city: 'Oslo', temp: 4, rain: true });
});JSON é um formato de texto para objetos e arrays. res.json(value) transforma o valor em JSON e define o cabeçalho Content-Type como application/json; um cabeçalho é uma linha nomeada enviada com a resposta, e este informa que tipo de corpo vem a seguir. O cliente recebe {"city":"Oslo","temp":4,"rain":true} e lê temp como um número.
res.send com uma string envia text/html, que um programa teria que analisar. As rotas para programas geralmente começam com /api, para que páginas e dados nunca compartilhem um caminho.
Desafio
FácilProgramas, como um aplicativo de celular, precisam dos dados do Recipe Box em um formato que consigam ler. Adicione uma API JSON junto às páginas.
- Em
server.js, adicione uma rota para/api/recipes. Ela envia todo o arrayrecipescomo JSON. - Adicione uma rota para
/api/recipes/:id. Ela encontra a receita da mesma forma que/recipes/:idfaz e envia o objeto completo da receita como JSON, não apenas o título. Para a receita 2, esse é o objeto com"id": 2,"title": "Pancakes","tags": ["breakfast", "sweet"]e o número de porções. - Quando nenhuma receita tiver esse id, responda com o status 404. Você pode enviar o texto
No such recipe, como a página faz.
Experimente: Pressione Executar e envie /api/recipes. Você deverá ver uma lista de quatro receitas, começando com Tomato Soup. Envie /api/recipes/2: o objeto Pancakes. Envie /api/recipes/99: status 404. Na aba Headers, /api/recipes tem um Content-Type de application/json. Em seguida, envie /about: seu Content-Type é text/html, porque res.send com uma string envia uma página.
Experimente você mesmo
import express from 'express';
import { recipes } from './data.js';
const app = express();
app.get('/', (req, res) => {
res.send('Welcome to Recipe Box');
});
// type('text') envia texto simples, então cada título aparece em sua própria linha.
app.get('/recipes', (req, res) => {
const { tag } = req.query;
const list = tag ? recipes.filter((recipe) => recipe.tags.includes(tag)) : recipes;
res.type('text').send(list.map((recipe) => recipe.title).join('\n'));
});
app.get('/recipes/:id', (req, res) => {
const recipe = recipes.find((r) => r.id === Number(req.params.id));
if (!recipe) {
res.status(404).send('No such recipe');
return;
}
res.send(recipe.title);
});
app.get('/about', (req, res) => {
res.send('Recipe Box collects family recipes.');
});
app.listen(3000, () => {
console.log('Recipe Box is running on port 3000');
});
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos de Express
Pratique por conta própria: Playground de Express