Criando e consumindo um serviço REST com NodeJS

Após trabalhar alguns anos com Java no backend decidi sair da zona de conforto e conhecer o NodeJS. Para um projeto de um cliente decidi utilizá-lo com o MongoDB. E a melhor forma de aprender e se propor a ensinar.

Um dos posts mais visualizados do blog é Criando e consumindo um serviço REST com Java. Sabendo disso, decidi escrever este para mostrar o processo de criação com NodeJS.

Iniciando o projeto

Crie uma pasta chamada rest-nodejs, acesse ela via terminal e execute o comando abaixo para criar o package.json.

npm init -y

Agora iremos adicionar 2 dependências ao nosso projeto

yarn add express body-parser

A primeira delas é o express que irá nos ajudar na tratativa de rotas e requests. A segunda é o body-parser que interpreta o body e parâmetros enviados via URL.

Criando crudController com método POST

Agora crie um diretório chamado src/app/controller. Dentro dessa pasta crie uma arquivo chamado crudController.js

const express = require('express'); //Importação do express

const router = express.Router(); //Variável de rota 


var pessoas = []; //Array estático de pessoas
var idPessoa = 0; //Variável que irá controlar os Ids gerados


// Rota de inserção
router.post('/', (req, res) => {
    const pessoa = { id: ++idPessoa, nome: req.body.nome };
    pessoas.push(pessoa);
    return res.status(201).send({ pessoas });
});


//Exportação do controller. Variável 'app' será passado por parâmetro
module.exports = app => app.use('/crud', router);

Criando index.js

Ótimo! agora precisamos criar o arquivo index.js que vai ficar dentro de src.

const express = require('express'); //Importação do express
const bodyParser = require('body-parser') //Importação do body-parser

const app = express(); //Variável app


app.use(bodyParser.json()); //Define que a aplicação irá receber objetos do tipo json
app.use(bodyParser.urlencoded({ extended: false })); //Utilizado para entender parâmetros via URL

require('./app/controller/crudController')(app); //Importação do controller criado passando a váriavel app adiante


app.listen(3000); //Porta que a aplicação ficará ouvindo

Veja como ficou a estrutura de pastas do projeto:

crud-nodejs

Testando inclusão (POST)

Inicialize o arquivo src/index.js

node src/index.js

Feito esse procedimento podemos testar a inserção de acordo com o Endpoint que foi criado. Utilize a ferramenta de sua preferência, eu utilizo o Postman.

Método: POST
URL: http://localhost:3000/crud
Body: { "nome": "Ronaldo" }

Após três persistências, veja o resultado:

{
    "pessoas": [
        {
            "id": 1,
            "nome": "Ronaldo"
        },
        {
            "id": 2,
            "nome": "Rivaldo"
        },
        {
            "id": 3,
            "nome": "Cafu"
        }
    ]
}

Criando método (PUT)

Vamos para o Endpoint de edição que também será adicionado no crudController.

// Rota de edição
router.put('/:id', (req, res) => {
    pessoas = pessoas.map(pessoa => {
        if (pessoa.id == req.params.id) pessoa.nome = req.body.nome;
        return pessoa;
    });

    return res.status(200).send({ pessoas });
});

Testando alteração (PUT)

Vamos substituir o Ronaldo pelo Romário.

Método: PUT
URL: http://localhost:3000/crud/1
Body: { "nome": "Romário" }

Agora como resultado temos:

{
    "pessoas": [
        {
            "id": 1,
            "nome": "Romário"
        },
        {
            "id": 2,
            "nome": "Rivaldo"
        },
        {
            "id": 3,
            "nome": "Cafu"
        }
    ]
}

Criando método (DELETE)

// Rota de exclusão
router.delete('/:id', (req, res) => {
    pessoas = pessoas.filter(pessoa => pessoa.id != req.params.id);

    return res.status(200).send({ pessoas });
});

Testando exclusão (DELETE)

Para remover um jogador é simples:

Método: DELETE
URL: http://localhost:3000/crud/3

Nova lista:

{
    "pessoas": [
        {
            "id": 1,
            "nome": "Romário"
        },
        {
            "id": 2,
            "nome": "Rivaldo"
        }
    ]
}

Criando método listarTodos(GET) e buscarPorId(GET)

Bacana! E como fazer para listar tudo e por id?

// Rota para buscar todos
router.get('/', (req, res) => res.status(200).send({ pessoas }));

// Rota buscar por id
router.get('/:id', (req, res) => {
    const pessoa = pessoas.find(pessoa => pessoa.id == req.params.id);

    return res.status(200).send({ pessoa });
});

Testando método listarTodos(GET) e buscarPorId(GET)

Método: GET
URL: http://localhost:3000/crud

{
    "pessoas": [
        {
            "id": 1,
            "nome": "Romário"
        },
        {
            "id": 2,
            "nome": "Rivaldo"
        }
    ]
}

Método: GET
URL: http://localhost:3000/crud/2

{
    "pessoa": {
        "id": 2,
        "nome": "Rivaldo"
    }
}

Em um próximo post pretendo fazer um comparativo entre o serviço criado em Java com o NodeJS. Disponibilizei no GitHub o código fonte junto com a collection do Postman. Até a próxima! 😀

Deixe uma resposta