Menu
CoddyTech

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.

challenge icon

Desafio

Fácil

Programas, 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.

  1. Em server.js, adicione uma rota para /api/recipes. Ela envia todo o array recipes como JSON.
  2. Adicione uma rota para /api/recipes/:id. Ela encontra a receita da mesma forma que /recipes/:id faz 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.
  3. 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');
});
quiz iconTeste seus conhecimentos

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