RESTful API com Node.js


Hoje em dia são poucas as aplicações que não necessitam de um backend service para suporte de dados. Para um indie developer é fundamental ter esse conhecimento.


O mais comum para ter um backend para uma aplicação será desenvolver um web service para ser consumido. São várias as possibilidades mas as mais comuns são:

Não sou muito adepto de ver conceitos teóricos num blog, por isso não o vou fazer. Prefiro explicar por miúdos o que se trata e se tiveram curiosidade em explorar mais sobre o tema podem sempre utilizar o DuckDuckGo.

Existem muitas diferenças entre REST e SOAP porque na realidade são coisas distintas. O SOAP é um protocolo enquanto REST é um modelo de arquitectura. É possível compará-las da seguinte forma:

Temos muitas opções para a criação de uma RESTful API. Algumas delas são:


Node.js

Neste momento estou a utilizar Node.js juntamente com Express.js. Node é um interpretador de JavaScript do lado do servidor, enquanto que Express é uma framework para Node e dá a possibilidade de criar aplicações web de forma bastante simples.

With a myriad of HTTP utility methods and Connect middleware at your disposal, creating a robust user-friendly API is quick and easy.

Easily building fast, scalable network applications: download

Os binários node e npm ficam disponíveis após a instalação do Node.js. O node é o compilador e o npm é o package manager oficial do Node.js.


Exemplo: api/get_users

Para se iniciar um projecto de raiz na directoria NodeServer:

mkdir NodeServer
cd NodeServer
npm init

O comando init irá configurar o projecto criando o ficheiro package.json. O ficheiro contém toda a configuração necessária. Por exemplo, para as seguintes opções:

name: (NodeServer)
version: (0.0.0) 1.0.0
description: Exemplo de um RESTful API
entry point: (index.js) app.js
test command:
git repository:
keywords: API
author: Ricardo Pereira
license: (ISC) MIT

irá gerar o seguinte package.json:

{
  "name": "NodeServer",
  "version": "1.0.0",
  "description": "Exemplo de um RESTful API",
  "main": "app.js",
  "scripts": {
     "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Ricardo Pereira",
  "license": "MIT"
}

Para se instalar módulos, neste caso o Express.js, basta correr o seguinte comando:

npm install express -S

O atributo -S serve para guardar a dependência no package.json. Se formos confirmar:

cat package.json
{
  "name": "NodeServer",
  "version": "1.0.0",
  "description": "Exemplo de um RESTful API",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Ricardo Pereira",
  "license": "MIT",
  "dependencies": {
    "express": "~4.9.0"
  }
}

No exemplo, decidi que a aplicação iniciasse com o ficheiro app.js. Para o criar:

touch app.js


Com a framework torna-se super simples criar uma API para ser consumida em REST. Por exemplo, para se aceder a uma lista de utilizadores (colocar o código no ficheiro app.js):

var express = require('express');
var app = express();
    
// Definir a route principal
app.get('/', function(req, res) {
  res.send('Welcome to API');
});

// Lista de Utilizadores
var users = [
  { id: 1, username: 'Manuel', email: '[email protected]' },
  { id: 2, username: 'Maria', email: '[email protected]' }
];

// Definir um endpoint da API
app.get('/api/get_users', function(req, res, next) {
  res.send(users);
})

// Aplicação disponível em http://127.0.0.1:9000/
app.listen(9000);

Com uma dúzia de linhas e ficamos com uma RESTful API pronta a ser usada. Para correr a aplicação:

node app.js

Neste momento a aplicação está à escuta na porta 9000. Para testar o acesso à API: http://localhost:9000/api/get_users.

Resultado:

[
  {
    "id": 1,
    "username": "Manuel",
    "email": "[email protected]"
  },
  {
    "id": 2,
    "username": "Maria",
    "email": "[email protected]"
  }
]


Conclusão

Neste exemplo, qualquer cliente tem acesso à API e por isso não é boa prática usá-lo em produção. O próximo artigo será sobre as várias estratégias de como proteger o acesso à API.

Abraço,

Ricardo Pereira



Comments

comments powered by Disqus