Node.js Desenvolvendo Aplicações RESTFul utilizando

apresentado a ferramenta Node.js ... ( H yp ert e xt Tr ansfe r Pro ... O surgimento de novas ferramentas como o Node.js1 e NPM2 contribuiu para que...

9 downloads 240 Views 1MB Size
 

III Escola Regional de Informática do Piauí. Livro Anais - Artigos e Minicursos, v. 1, n. 1, p. 532-548, jun, 2017. www.eripi.com.br/2017 - ISBN: 978-85-7669-395-6

 

Capítulo 

15   

Desenvolvendo  Aplicações  RESTFul  utilizando  Node.js  Aislan  Rafael  Rodrigues  de  Sousa  e  Washington  Henrique  Carvalho  Almeida 

Abstract  The  development  of  web  applications  and  services  has  grown  due  in  part  to  the  popularization  of  new  and  more  productive  technologies  and  the  popularization  of  them.  This  chapter  presents  basic  web  fundamentals  through  the HTTP communication  protocol,  which  is  a  widely  used  and  widespread  technology.  REST  architectural  style  that  makes  use  of  such  technologies  to  their full potential. Also presented is the Node.js  tool  that  has  a  low  learning  curve  and  allows  developing  solutions  to  provide  services  with  high  scalability  along  with  the  application  example  that  uses  the  REST  architectural style.  Resumo  O  desenvolvimento  de  aplicações  e  serviços  web  tem  crescido  devido,  em  parte,  a  popularização  de  novas tecnologias mais produtivas e a popularização das mesmas. No  presente  capítulo  é  apresentado  fundamentos  básicos  da  web  através  do  protocolo  de  comunicação  HTTP,  que  é  uma  tecnologia  bastante  utilizada  e  difundida.  O  estilo  arquitetural  REST  que  faz  uso  de  tais  tecnologias  em  todo  seu potencial. Também será  apresentado  a  ferramenta  Node.js  que  possui  uma  baixa  curva  de  aprendizado  e  permite  desenvolver  soluções  para  prover serviços com alta escalabilidade junto com o  exemplo de aplicação que utiliza o estilo arquitetural REST. 

15.1. Introdução  Com  a massificação tecnológica das últimas décadas em 2016, 51% dos lares brasileiros  têm  acesso  à  internet  [CGI.BR  2016]⁠.  A  população  brasileira  possui  cada  vez  mais  acesso  a  internet  e  utiliza  diversos  diversos  dispositivos  para  fazer  o  acesso  a  mesma,  dos  quais  podemos  citar  ​smartphones​,  ​tablets​, ​notebooks entre outros. Cresce também a  demanda  por  aplicações  dos  mais  diversos  tipos  incluindo  ​web services para que outras   

    aplicações possam consumir esses dados.  O  sucesso  da  WEB  acontece,  em  grande  parte,  por  conta  de  que sua arquitetura  de  ​software  foi  projetada  para  atender  as  necessidades  de  hipermídia  distribuída  em  larga  escala  [Fielding,  2000].  O  HTTP  (​Hypertext  Transfer  Protocol​)  é  o  principal  protocolo  de  comunicação  para  as  aplicações  web.  Outro  fator  que  contribuiu  para  o  crescimento  da  web  foi a popularização do REST (​Representational State Transfer​) que  consiste  em  um  conjunto  de  princípios  de  arquitetura  que,  quando  seguidas,  permite  a  criação de um projeto com interface bem definidas.   Aplicações  que  que  utilizam  os  princípios  REST  são  chamadas  de  RESTFul.  O  REST  é  frequentemente  aplicado  para  disponibilizar  serviços  para  outros  aplicações  (​web  services​)  e  o  mesmo  utiliza  integralmente  as  mensagens  HTTP para se comunicar  através do que já é definido no protocolo.  Segundo  a  Stack  OverFlow  (2017)  a  linguagem  de  programação  JavaScript  é  uma  das  mais  populares  entre  os  desenvolvedores.  Inicialmente  seu  uso  era  voltado  apenas para o uso em navegadores. O surgimento de novas ferramentas como o Node.js1  e  NPM2  contribuiu  para  que  a  linguagem  fosse  amplamente  utilizada  para  finalidades  além do que ela foi inicialmente idealizada.   Desde  2010  até  os  dias  de  hoje,  o  Node.js  cada  vez  mais  provou  ser  uma  plataforma  excelente  na  solução  de  diversos problemas, principalmente para construção  de  APIs  RESTful.  Sua  arquitetura  ​Single  Thread  que  realiza  operações  de  entrada  e  saída não bloqueantes rodando em cima da linguagem de programação JavaScript. 

15.2 Referencial Teórico   Para  o  entendimento  do  estudo  de  caso  exposto  neste  é  necessária  a  apresentação  de  alguns  conceitos.  Será  apresentado  o  protocolo  HTTP,  o  estilo  arquitetural  REST,  a  linguagem de programação JavaScript e também a ferramenta Node.js.  15.2.1 Protocolo HTTP  Ao  acessar  a  internet  um  determinado  usuário  utiliza  um  navegador  como por exemplo  o  google  chrome3  ou  firefox4.  O  usuário  informa  um  endereço  e  o  navegador  faz  uma  requisição  o  qual  é  respondido  por  um  servidor.  Essa  forma  de  trabalhar  onde  um  cliente  faz  uma  requisição  e  o  servidor  responde  é  chamada  de  arquitetura  cliente  servidor.  Para  que  essa  comunicação  ocorra deve haver regras de comunicação, ou seja,  um protocolo que estabelece a forma com que o cliente e servidor devem se comunicar.   O  principal  protocolo  de  internet  é  o  HTTP  o  qual  será  nosso  objeto  de  estudo.  A figura 15.1 apresenta a representação gráfica de como ocorre esse processo.     

1

 Disponível em https://nodejs.org   Disponível em https://www.npmjs.com/  3  Disponível em https://www.google.com/chrome  4  Disponível em https://www.mozilla.org/pt-BR/firefox/new/  2

 

   

  Figura 15.1 - Representação do HTTP   

O  protocolo  HTTP  tem  como  objetivo  distribuir  objetos  de  hipermídia  os  quais  são  referenciados  por  uma  URL(​Uniform  Resource  Locator​)  [EMER  2014].  Por  URL  podemos  entender  por  regras  bem  definidas  para  descrever  recursos  disponíveis  na  WEB,  ou  seja,  são  os  endereços  utilizados  na  WEB  um  cliente  para  fazer  acesso  ao  servidor deve informar uma URL.   Para  organizar  a  comunicação  entre  servidor e cliente o HTTP são estabelecidos  cabeçalhos  para  a  requisição  do  cliente  e  a  resposta  do  servidor.  No  cabeçalho  da  requisição  podemos  encontrar  informações  como  por  exemplo  preferência  de  idiomas,  codificação e formato de conteúdo na resposta [EMER 2014].   Um  usuário  ao  utilizar  um  navegador  informando  um  determinado  endereço,  como  por  exemplo  http://www.eripi.com.br/2017,  é  automaticamente  feita  uma  requisição  utilizando  o  método  GET  do  protocolo  HTTP.  Um  método  do  protocolo  HTTP serve para reportar qual é a intenção ou ação desejada a ser executada.   Ainda  sobre  os  métodos  HTTP  pode-se  destacar  dois  conceitos  importantes:  (i)  idempotentes  e  (ii) seguro. Temos um método idempotente quando o mesmo é chamado  n  vezes  e  traz  sempre  o  mesmo  resultado.  Já  o  método seguro se trata quando o mesmo  não altera um recurso disponível no servidor.    A  figura  15.2  demonstra  a saída no terminal de uma requisição feita utilizando o  curl  em  um  terminal.  O  curl  que  é  uma  ferramenta  em  modo  texto  utilizada  para  transferir  dados  pela  sintaxe  de  chamada  [CURL  2017].  O  comando  utilizado  no  terminal  foi:  ​curl  http://www.eripi.com.br/2017  -v​.  Ainda  observando  a  figura  15.2  o  texto  precedido  de  >  representa  as  informações  da  requisição  feito  pelo  cliente  e  o  precedido  de  <  representa  a  resposta  dada  pelo  servidor.  Podemos  observar  que  na  requisição  é  passada  informações  como  o  método,  a  versão  do  protocolo  utilizado  e  o  endereço do servidor.   

 

   

  Figura 15.2 - Exemplo de cabeçalho HTTP 

  Temos  os  métodos  propostos  por  Fielding  (1999) para a especificação do HTTP  1.1:   ● GET  ​-  Tem  o  objetivo  obter um recurso que representado por uma identificação  única denominado URI (​Uniform Resource Identifier​).  ● HEAD  -  O método HEAD é idêntico ao GET exceto que o mesmo não retorna o  corpo da mensagem apenas o cabeçalho.  ● POST​ - Serve para criar novos recursos no servidor.   ● PUT ​- Altera um recurso no servidor.    ● DELETE ​- Tem objetivo de excluir um recurso do servidor.  Os  métodos  HEAD  e  GET  são  métodos  seguros  pois  os  mesmos  apenas  retornam  informações  sem  alterar  recurso.  Os  métodos  PUT  e  DELETE  são  idempotentes  pois  apesar  de  poder  alterar algum recurso no servidor os mesmos sempre  trazem o mesmo resultado.   O  método  POST  não  se  encaixa  em  nenhum  dos  dois  conceitos  pois  ele  usualmente  é  utilizado  para  criar  novos  recursos  e trazendo resultados diferentes. Ao se  fazer  uma  requisição  junto  a  resposta  do  servidor  é  retornado  um  código  de  status  que  informa ao cliente o resultado da requisição.   O  código  de  status  é  denominado  ​status  code  e  é  composto  por  um  número  inteiro  por três dígitos e informa ao cliente o resultado da requisição [FIELDING 1999].  No  exemplo  da  figura  15.2  o  status  retornado  é  o  301  movido  permanentemente,  ou  seja,  significa  que  o  recurso  que  deveria  corresponder  ao  endereço  inicial  foi  redirecionado  permanentemente  para  outro  endereço.  Os  números  de  status  code  são  divididos  em  5  (cinco)  famílias:  (i)  1XX  -  representam  informações;  (ii)  2XX  -  representa  que  a operação foi realizada com sucesso; (iii) 3XX - redirecionamentos; (iv)  4XX - erro originado no cliente e (v) 5XX - erros originados no servidor.     

    15.2.2 REST  REST  é  um  estilo  arquitetural  para  sistemas  de  hipermídia  distribuídos  [FIELDING  2000].  Podemos  também  dizer  que  REST  é  uma  abordagem  para  desenvolvimento  serviços  web  que  busca simplicidade e baixo acoplamento [SALVADORI 2015]. Como  citado  anteriormente  o  termo  RESTFul  é  utilizado  para  designar  aplicações  que  implementam  os  princípios  definidos  no  estilo  arquitetural  REST.  Pode  ser  utilizado  qualquer  protocolo  para  implementar  o  estilo  arquitetural  REST,  mas  no  presente  trabalho  o  protocolo  HTTP  será  adotado  como  padrão  devido  a  sua  popularidade  na  Web.   Para  entender  melhor  o  estilo  arquitetural  é  importante  destacar  três  conceitos  importantes:  (i)  recurso;  (ii)  operações  e  (iii)  representações.  Recurso  é  qualquer  informação  a  qual  é  disponibilizada  para  os  clientes  através  de  um  identificador  único  (URI).  Também  podemos  conceituar  recurso  como sendo a fonte de representações e as  representações  são  um  conjunto  de  dados  que  representam  o  estado  do  recurso  solicitado  [MORO  et.  al  2011].  As  URIs  devem  possuir  um  padrão  de  notação,  serem  descritivos  e  possuir  uma  hierarquia  previamente  definida  [RODRIGUES  2014].  Um  mesmo  recurso  pode  ser  identificado  por  um  ou  mais  URIs,  mas  uma  URI  identifica  apenas um recurso.   Cada  recurso  pode  ter  mais  de  uma  representação, sendo que, cada recurso deve  ter  pelo  menos  uma  representação.  O  HTTP  possui  operações  e  o  recomendado  é  respeitar  a  semântica  e  utilizar  adequadamente  as  mesmas  sendo  as  principais  GET,  POST,  PUT  e  DELETE.  Acontecem  casos  onde  a  equipe  de  desenvolvimento  negligência  o  uso  das  operações  e  acaba  utilizando  o  operador  GET  para  realizar  as  mais  diversas  ações  o  que  acaba  não  sendo  uma  boa  prática.  A  representação  de  um  determinado  recurso  pode  ser  feito  de  diversas formas como por exemplo HTML, PDF,  JSON  ou  XML.  A  figura  15.3  faz  uma  representação  gráfica  envolvendo  os  conceitos  apresentados.     

   Figura 15.3 - Componentes da arquitetura REST   

É  importante  observar  que  quando  é  realizada  uma  requisição  a  resposta  deve  conter  um  status  ou  mensagem.  Como  estamos  tomando  por  base  o  protocolo  HTTP  deve  ser  retornado  o  ​status  code ​adequado. A figura 15.4 ilustra uma requisição que um  determinado  dispositivo  ​mobile  ​que  faz  utilizando  a  operação  GET  a  qual  solicita  o  recurso  presente  no  endereço  http://www.eripi.com.br/2017/.  Logo  após  a  requisição   

    acontece  a  resposta  do  servidor  que  contém  o  ​status  code  200  o  qual  indica  que  tudo  aconteceu  como  o  esperado.  Ainda  na  resposta  é  informado  que  a  representação  do  recurso  retornada  é  um  HTML.  Os  ​status  code  pertencente  ao  protocolo  HTTP,  os  mesmos  fornecem  uma  maneira  adequada  de  categorizar  e  padronizar  as  respostas  das  requisições  e  ao  utilizar  o  estilo  arquitetural  REST  devem  ser  obrigatoriamente  utilizados [SALVADORI 2014].   

 

  Figura 15.4 - Modelo de requisição resposta  

  Ao  desenvolver  uma  aplicação  o  foco  central  são  os  recursos.  Depois de definir  os  recursos  basta  utilizar  as  operações  que  também  são  chamados  de  verbos  para  manipular  esses  recursos.  Uma  boa  prática  é  fazer  uso  do  HATEOAS  (​Hypermedia  as  the  Engine  of  Application  State​)  que  implica  que  as  representações  de  recursos  devem  conter, além dos dados, controles hipermídia com transições válidas.   Na  prática  isso  ocorre  ao  adicionar  a  resposta  do  servidor  endereçamentos  para  novas  requisições  a  partir  da  resposta  que acabou de ser entregue indicando ao cliente o  que pode ser feito a partir daquele determinado recurso.    Fielding  (2000)  define  restrições  para  o  estilo  arquitetural  REST  o  qual  serve  como princípios do mesmo. Estão listadas abaixo:   ● Arquitectura cliente servidor - visa a separação de responsabilidades como por  exemplo  a  interface  do  usuário  com  problemas  de  armazenamento.  Essa  abordagem  permite  ter  interfaces  diferentes  de  usuário  garantindo  a  portabilidade em diferente plataformas;  ● Stateless  -  As  requisições  devem  ser  independentes,  ou  seja,  as  requisições  devem  conter  todas  as  informações  necessárias  para  o  servidor  responder.  Na  prática  o  protocolo  de  comunicação  não  mantém  o  estado  das  requisições  não  havendo  portanto  como  recuperar  informações  das  requisições  anteriores,  ou  seja,  o  servidor  não  deve  recorrer  a  informações  armazenadas  em  sessão  de  usuário;  ● Cache  -  Torna  possível  o  cliente  armazenar  localmente  resultados  de  requisições.  Possibilita  a  reutilização  das  informações  e  aumento  da   

    performance.  ● Interface  Uniforme  -  É  a  restrição  central  da  arquitetura  REST.  Se  configura  através  do  estabelecimento  de  uma  interface  uniforme  entre  cliente  e  servidor.  Define  quatro  princípios  fundamentais:  (i)  identificação  de  recursos,  (ii)  manipulação  de  recursos  por  meio  de  representações,  (iii)  mensagens  auto  descritivas e (iv) recursos hipermídia.    ● Sistema  em  camadas  -  Permite  que  a  arquitetura  seja  composta  por  camadas  hierárquicas  condicionando  os  componentes  de  tal  forma  com  que  os  mesmos a  não terem acesso a outras camadas que não seja a adjacente.   ● Código  sob  demanda  -  Permite  mover  um  código  no  servidor  para  ser  executado no cliente.   15.2.3 JavaScript  O  JavaScript  surgiu  em  1995  para  rodar  no  navegador  Netscape  e  posteriormente  foi  adaptado  para  a  maioria  dos  navegadores  Web  [HAVERBEKE  2014].  Idealizado  inicialmente  para  rodar  nos  navegadores  atualizando  o  conteúdo  dinamicamente.  Esse  contexto  contribuiu  para  que  evoluísse  de  uma  forma  diferente  das  outras  linguagens  focado  em  performance,  criação  de  interfaces  e  dar  uma  melhor  experiência  para  o  usuário [NETO 2017].  Conforme  aconteceu  a  evolução dos navegadores o JavaScript acompanhou essa  evolução.  Com  o  surgimento  do  conceito  de  nuvem  as  aplicações  necessariamente  precisam  ser  escaláveis e com esse novo contexto foi necessário tirar maior proveito das  máquinas  e  utilizar  o  mínimo  de  recurso  possível.  Houveram  também  outras  propostas  como divisão de carga e micro-serviços.   É  necessário  conhecer  a  especificação  da  linguagem  de  script  que  o  JavaScript  implementa  o  ECMAscript.  A  especificação  é  mantida  pelo  ECMA  Technical  Committee  39  (TC39)  o  qual  é  formado  por  especialistas  de  grandes  empresas  [Pinho  2017].  Através  da  especificação  é  possível  acompanhar  quais  funcionalidades  estão  disponíveis nas aplicações que implementam a especificação.    15.2.3 Node.js  O  Node.js  pode  ser  definido  como  um  ambiente  ​runtime  para  a  linguagem  de  programação  JavaScript  que  roda  em  cima  de  uma  ​engine  conhecida como Google V85  [NETO  2017].  O  V8  é  uma  engine  criado  pela  empresa  Google  para  ser  utilizada  no  navegador Chrome.   O  JavaScript  é  uma  linguagem  interpretada,  mas  o  V8  interpreta e compila para  linguagem  de  máquina  otimizando,  com  a  utilização  de  heurísticas.  A  arquitetura  do  Node.js  é  não-bloqueante  o  que  faz  ela  apresentar  uma  boa  performance  com  o  consumo  de  memória  utilizando  de  forma  eficiente  o  poder  de  processamento  dos  servidores [PEREIRA 2013].  Pereira (2017) destaca algumas características do Node.js:  ● Single  Thread  -  Cada instância terá instância de apenas um processo. É utilizado  5

 

 Disponível em http://code.google.com/p/v8 

    programação  assíncrona  e  recursos  compartilhados  para  tirar  maior  proveito  da  thread​ utilizada;   ● Operações  de  entrada  e  saída  assíncrono  e  não  bloqueante  -  Facilita  execução  paralela e o aproveitamento de recursos.  ● Event-loop​ - É orientado a eventos. 

15.3 Estudo de Caso  As  ​Web  Services  REST  também  conhecidas  como  WEB  API  são  bastante utilizadas na  implementação  de  sistemas  distribuídos  [SALVADORI  2015].  Quando  uma  determinada  aplicação  implementa  os  princípios  REST,  como  já foi dito, é denominada  RESTFul.  O  estudo  de  caso  proposto  se  trata  de  uma  WEB  API  para  prover  recursos  voltados  para  controle  financeiro pessoal. O foco da aplicação será o gerenciamento das  despesas  pessoais  e  será  uma  plataforma  que  pode  ser  utilizada  por  outros  aplicativos  fazer gerenciamento dos gastos pessoais.  A  aplicação  permite:  (i) cadastrar uma nova despesa; (ii) confirmar o pagamento  da  despesa;  (iii)  cancelar  uma  determinada  despesa  caso  a  mesma  não  seja  mais  necessária;  (iv)  retornar  todas  as  despesas  cadastradas  e  (v)  retornar  uma  despesa  em  específico.  Para  a  representação  dos  recursos  foi  escolhido  o JSON (​JavaScript Objetct  Notation​).  Podemos  observar  na  figura  15.5  a representação de uma despesa utilizando  JSON.   

  Figura 1.5 - Representação de uma despesa utilizando JSON 

  A  despesa  possui  uma  descrição  que  indica  a  natureza  da  despesa,  mês  indicando  o  mẽs  em  que  a  despesa  foi  realizada,  o  ano  indicando  o  ano  que  a  despesa  foi  realizada,  o  valor a ser pago por conta da despesa e o status que possui três possíveis  valores  CRIADO,  CONFIRMADO  ou  CANCELADO.  O  status  CRIADO  serve  para  indicar  que  a  despesa  foi  criada,  o CONFIRMADO serve para indicar que a despesa foi  paga  e  o  CANCELADO  indica  que  por  algum  motivo  a  despesa  deve  ser  desconsiderada.    15.3.1 Estrutura do Projeto  A  linguagem  de  programação  escolhida  é  o  JavaScript  e  a  ferramenta  o  Node.js.  Também  é  utilizado  o  NPM  (​Node  Pakage  Manager​)  o  qual  é  utilizado  para  criar  projetos,  automatizar  tarefas  e  gerenciar  dependências  [NETO  2017].  Foram  utilizados   

    as  seguinte  bibliotecas  que  estão  presentes  no  repositório  do  NPM:  (i)  express;  (ii)  express-load; (iii) express-validator; (iv) body-parser e o (v) mysql.   O  express  estende  as  capacidades  do  Node.js  adicionando  ​middlewares  ​e outras  capacidades  [ALMEIDA  2014].  O express-load tem a função de auxiliar no processo de  carregar  os  módulos  para  que  os  mesmos  sejam  feitos  automaticamente.  O  express-validator tem a função de auxiliar na validação de dados de entrada.   Já  o  body-parser  serve  para  transportar os dados como JSON pois as requisições  com  as  operações  POST  ou  PUT  ao  serem  executadas  transporta  os  dados  como  texto.  Por  último  a  biblioteca  mysql  serve  para  facilitar  a  comunicação  com  o  sistema  gerenciador  de  banco  de  dados  MySQL6  o  qual  será  utilizado  para  fazer a persistência  dos dados.   A  figura  15.5  representa a estrutura de pastas utilizada na WEB API. O nome do  projeto  é  ​node-simple-rest-wallet​.  Dentro do projeto temos as pastas ​config,​  ​controllers​,  persistencia  e  ​routes​.  A  pasta  ​config  é  destinada  para  arquivos  de  configuração.  Foi  utilizado  o  arquivo  custon-express.js  para  armazenar  todas  as  configurações  utilizadas  no express.   Temos  na  pasta  routes  todas  as  rotas  uma  para  o  recurso  e  operação.  Na  pasta  controlles  temos  a  implementação  das  rotas,  ou  seja,  o  código  onde  de  fato  é  implementação  a  lógica  por  trás  de  cada  operação.  Na  pasta  principal  temos  os  dois  arquivos  package.json  e  app.js. O package.json tem o papel de guardar as configurações  do  NPM  referente  ao  projeto,  guardar  os  ​scripts  para  executar  a  aplicação  e  os  testes  [NETO  2017].  O  arquivo  app.js  é  o  ponto  de  partida  onde  será  informado  o  endereço  do servidor e a porta o qual irá funcionar.     

  Figura 15.5 Estrutura de pastas e arquivos 

  É  necessário  conhecer  os  detalhes  dos  recursos  e  como realizar requisições para  que  outras aplicações possam interagir com a WEB API proposta [SALVADORI 2014].  É  apresentado  na  tabela  15.1  os  recursos  disponíveis  e  as  operações  permitidas  para  6

 

 Disponível em https://www.mysql.com/ 

    cada  um.  O  recurso  ​/despesas/despesa  possibilita  executar  duas  operações  sendo  elas  POST  e  o  GET.  Temos também o recurso ​/despesas/despesa/{id} que permite utilizar a  variável  id  e  possibilita  as  operações  GET,  PUT  e  DELETE.  A  variável  id  identifica  unicamente uma determinada despesa o qual deve ser substituído pelo valor desejado.      Tabela 15.1 Recursos e Operações 

Recurso 

Método 

Descrição 

/despesas/despesa 

POST 

Cadastrar nova despesa 

GET 

Obter a lista contendo todas as despesas 

GET 

Obter despesa identificada pelo id 

PUT 

Confirmar pagamento de despesa 

DELETE 

Cancelar despesa  

/despesas/despesa/{id} 

  Na  WEB  API  esse  mapeamento  é  feito  dentro  da  pasta  ​routes​.  A  aplicação  representa  um  serviço  web,  ou  seja,  funcionalidades  definidas  através  de  rotas.  A  rota  pode  ser  entendida  como  um  serviço  a  ser  implementado  e  para  isso  necessita  de  um  endereço  a  partir  do  qual  esse  serviço  será  acessado,  uma  função de retorno que deverá  conter  o  código  a  ser  executado  e  a  operação  (método  HTTP)  que  define  a  forma  de  acesso a rota.   Na  figura  15.6  temos o código fonte do mapeamento das rotas. Pode-se observar  que  é  declarado  antes  das  rotas  uma  constante  que  recebe  um  objeto  despesa.  O  objeto  está  na  pasta ​controllers onde o mesmo contém funções que implementam as ações para  cada  rota.  Essa  separação  permite  visualizar  no  código  fonte,  de  forma  simplificada,  cada recurso com suas respectivas operações.    

  Figura 15.6 - Representação do mapeamento de rotas 

   A  persistência  ficará  a cargo do sistema gerenciador de banco de dados MySQL.  Na  figura  15.7  temos  a  representação  do  esquema  da  tabela  despesa.  Na  pasta  persistência  foi  implementado  o  objeto  DespesaDAO  o  qual  possui  funções  que   

    realizam a persistência e recuperação de dados no banco criado através do MySQL.    

  Figura 15.7 - Esquema da tabela despesas 

   15.3.1 Implementação das rotas  A  primeira  rota  tem  como  endereço  /despesas/despesa  e  a  operação  POST.  Na  requisição  é  passado  um  JSON  com  os  dados  da  despesa.  A  WEB  API  ao  receber  a  requisição  validar,  persistir  no  banco  e  retornar  os  dados.  Na  resposta,  entre  outras  informações,  é  passado  o  ​status  code  201  que  indica  que  o  recurso  foi  criado  com  sucesso,  o  tipo  da  representação  (​application/json​)  e  o  JSON  contendo  as  informações  que foram persistidas.   Ao  ser  criada  a  despesa  o  seu  status  passa  a  ser  “CRIADO”  indicando  que  a  despesa  foi  criada,  mas  ainda  não  foi  paga.  Ainda  no  JSON,  seguindo  o  princípio  HATEOAS,  é  acrescentado  informações  (​links​)  de  quais  os  possíveis  próximos  passos  que  podem  ser  tomados a partir do recurso que criado. A figura 15.8 faz a representação  de uma requisição a rota.    

  Figura 15.8 - Representação da rota POST /despesas/despesa 

 

      A  implementação  da  rota  POST  /despesas/despesa  está  na  função  postDespesa  que  faz  parte  do  objeto  despesa  dentro  da  pasta  ​controller​.  A  figura  15.9  demonstra  o  código  fonte  onde  podemos  observar  que  é  recebido  os  dados  da  requisição  e  logo  depois é alterado o ​status​ da despesa para CRIADO.   Para  controlar  a  conexão  com  o  banco  de  dados  é  utilizado  o  objeto  connectionFactory  e  o  mesmo  é  passado  como  parâmetro  para  o  objeto  DespesaDAO.  Ambos estão implementados na pasta persistência.   Caso  aconteça  algum  erro  durante  a  persistência é retornado um ​status code 500  indicando  que  houve  um  erro  interno  ao  servidor.  Se  não  houver  nenhum  problema  é  indicado  uma  ​location  ​para  informar  o  endereço  do  novo  recurso  criado  e  retorna  um  JSON  com  as  informações  da  despesa  e  os  ​links  ​com  possíveis  rotas  que  podem  ser  requisitadas a partir do recurso que acabou de ser criado.   

  Figura 15.9 Código fonte da implementação da rota POST /despesas/despesa 

  Na  rota  GET  /pessoas/pessoa  é  retornado  um  ​status  code  200  que  indica  que   

    tudo  ocorreu  como  o  esperado  e  um  ​array  de JSON com todas as despesas. A operação  GET  é  segura  pois  a  mesma  não  altera  os  recursos  no  servidor.  A  figura  15.10  faz  a  representação gráfica da rota GET /pessoas/pessoa.    

  Figura 15.10 - Representação da rota GET /despesas/despesa 

A  implementação  da  rota  GET  /despesas/despesas  está  na função getDespesas e  consiste  apenas  em  consultar  no  banco  de  dados  as  despesas  existentes  e  retornar  às  mesmas  em  um  ​array​.  Assim  como  na  rota  anterior  caso  exista  algum  problema  na  conexão  é  retornado um ​status code 500 indicando ao cliente que houve um erro interno  no processamento no servidor. A figura 15.11 demonstra a implementação da rota.   

  Figura 15.11 - Código fonte Código fonte da rota GET /despesas/despesa 

  A  rota  GET  /despesas/despesa/{id}  é  análoga  a  despesa  a  rota  GET  /despesas/despesa.  A diferença está no retorno o qual consiste em um JSON com apenas  a  despesa  identificada  através  do  parâmetro  id.  A  figura  15.12  mostra  a  representação  gráfica da rota. A figura 15.12 faz a representação gráfica da rota.    

 

   

  Figura 15.12 Representação da rota GET /despesas/despesa/{id} 

  Em  sua  implementação  pode  ser  observado  que  o  parâmetro  id  é  utilizado  para  recuperar  do  banco  de  dados  a  despesa  qual  o  mesmo  identifica  unicamente.  Na  resposta  é  retornado  o  ​status  code  padrão,  ou  seja,  o  200.  A  figura  15.13  apresenta  o  código fonte da rota GET /despesas/despesa/{id}. 

  Figura 15.13 Código fonte da rota GET /despesas/despesa/{id} 

  Através  da  rota  PUT  /despesas/despesa/{id}  é  possível  confirmar  o  pagamento  da  despesa  identificada  através  do  parâmetro  id.  A  operação  PUT  é  idempotente  pois a  mesma  sempre  traz  o  mesmo  resultado  independente  da  quantidade  de  vezes  que  é  executada.  Caso  tudo  ocorra  como  esperado  também  irá  retornar  o  ​status  code  200.  A  figura 15.14 demonstra a representação gráfica da rota PUT /despesas/despesa/{id}.    

 

   

  Figura 15.14 Representação da rota PUT /despesas/despesa/{id} 

  A  função  que  implementa  a  rota  PUT  /despesas/despesa/{id}  é  o  putDespesa.  Após  pesquisa  a  despesa  a  qual  o  parâmetro  id  identifica  é  feito  uma  atualização  indicando  o  ​status  mudou  para  CONFIRMADO.  Na  figura  15.15  é  possível  verificar  a  implementação da rota. 

  Figura 15.15 Código fonte da rota PUT /despesas/despesa/{id} 

  Por  fim,  temos  a  rota  DELETE  /despesas/despesa/{id}  onde  a  mesma  tem  o  objetivo  de  cancelar  uma  determinada  despesa  mudando  o  seu  status  para  CANCELADO  através  do  id  passado  como  parâmetro. Caso ocorra tudo com sucesso é  retornado o status code 204. A figura 15.16 trás a representação gráfica da rota.      

 

   

  Figura 15.16 Representação da rota DELETE /despesas/despesa/{id} 

  A  função  que  implementa  a  rota  DELETE  /despesas/despesa/{id}  é  a  deleteDespesa.  A  operação  DELELTE  também  é  idempotente.  Caso  ocorra  tudo  como  esperado a resposta do servidor retorna o ​status code​ 204.   

  Figura 15.17 Código fonte da rota DELETE /despesas/despesa/{id} 

 

15.4 Considerações Finais  Neste  capítulo  foram  apresentados  conceitos  gerais  sobre  a  arquitetura  de  aplicações  web  sobre  o  protocolo  HTTP  baseada  em  serviços  REST  implementados  com  a  tecnologia  Node.js.  A  popularização  da  Internet  no  Brasil  ampliou  a  gama  de  serviços  oferecidos  para  a  população,  abrindo  um  novo  leque  de  possibilidades  para  a expansão  das implementações baseadas em arquiteturas melhores adaptadas a essa nova realidade.  Neste  trabalho  foram  apresentados  os  conceitos  básicos  para  implementação  de  web  services  e  um  roteiro  de  implementação  detalhado  com  objetivo  de  demonstrar  as  melhores  práticas  para  desenvolvimento  de  soluções  REST  com  Node.js  apoiadas  nas  técnicas  de  engenharia  de  software,  buscando  alta  coesão,  baixo  acoplamento,  melhor  manutenibilidade, escalabilidade e agilidade no desenvolvimento. 

 

   

Referências   ALMEIDA,  F.  MEAN  Full  Stack  JavaScript  para  aplicações  web  com  MongoDB, Express, Angular e Node. Casa do Código, 2014.   CGI.BR. TIC Domicílios 2015. São Paulo: cgi.br, 2016.  CURL. Disponível em . Acesso em 05 de Maio de 2017.  EMER,  Jean  Carlo.  O  grande  desencontro  do  HTTP  com  o  HTML:  6  de  janeiro  de  2014.  Disponível  em:  .  Acesso  em  10  de  Maio 2017.  FIELDING, Roy et al. Hypertext transfer protocol--HTTP/1.1. 1999.  FIELDING,  R.  T.  REST:  Architectural  Styles  and  the  Design  of  Network-based  Software  Architectures.  Tese  (Doctoral  dissertation)—University  of  California,  Irvine,  2000.  Disponível  em:    HAVERBEKE,  Marijn.  Eloquent  javascript:  A  modern  introduction  to  programming.  No Starch Press, 2014.  MORO, T. D.; DORNELES, C. F.; REBONATTO, M. T. Web services WS- * versus Web Services REST. REIC - Revista de Iniciação Científica, v. 11, n. 1, p. 36–51, 2011. NETO, W. Construindo APIs testáveis com Node.js. [s.l.] LeanPub, 2017. PEREIRA,  C.  R.  Construindo  APIs  Rest  com  Node.js.  1.  ed.  São  Paulo:  Casa  do  Código, 2016.   PEREIRA,  C.  R.  Node.js:  Aplicações  web  real-time  com  Node.js.  São  Paulo:  Casa  do  Código, 2013.   PINHO,  D.  M.  DE.  ECMAScript  6  -  Entre  de  Cabeça  no  futuro do JavaScript. Casa do  código, 2017.  RODRIGUES,  L.  Desenvolvimento  de  Aplicações  Móveis  com  Serviços  RESTful  e  HTML5. p. 171–179, 2014.  SALVADORI,  I.  L.  Desenvolvimento  de  Web  APIs  RESTful  semânticas  baseadas  em  JSON. Igarss 2014, n. 1, p. 1–5, 2015.  STACK  OVERFLOW.  Developer  Survey  Results  2017.  Disponível  em  . Acesso em 01 de Maio de 2017.