Prévia do material em texto
API
API REST
REST significa Representational State Transfer ou Transferência de
Estado Representacional que estabelece uma arquitetura de software que
define características para criação de um webservice.
RESTful significa que um webservice está de acordo com estrutura
definida pelo padrão REST.
Este padrão estabelece um protocolo de comunicação sem estado
(stateless), onde toda informação necessária para atender a requisição
está contida na mensagem HTTP. Todos os recursos devem ser
identificados apenas por sua URI (Uniform Resource Identifier -
Identificador Uniforme de Recurso).
Por sua vez, estas mensagens HTTP possuem características
específicas, que são diferenciadas por seus métodos: GET, HEAD, POST,
PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH. Comumente,
quando se desenvolve uma API, os métodos GET para consulta, POST
para criação de um documento, PUT para modificar um documento,
PATCH também para modificar um documento e DELETE para remover
um documento, são os mais utilizados, pois fazem referência a sigla
CRUD (Create, Retrieve, Update e Delete) - operações que realizamos no
banco de dados.
Projeto Node.js
O Node.js é um Runtime Javascript assíncrono orientado a eventos
projetado para construir aplicativos de rede escaláveis. Com o auxílio do
Node.js e algumas bibliotecas, criaremos uma API RESTful.
Para este projeto, foram utilizadas as bibliotecas express e nodemon,
onde:
•
Express é um Framework javascript para back-end Node.js. Esta é uma
dependência do projeto, sendo necessária para o ambiente de
produção para seu funcionamento.
•
Nodemon nos permite monitorar alterações de arquivos e reiniciar o
servidor Express, reexecutando o ponto de entrada do projeto. Esta já
não é uma dependência de projeto, mas sim, uma dependência de
desenvolvimento, que não entrará no ambiente de produção.
Toda vez em que se inicia um projeto utilizando o NPM ou Yarn através do
comando init, o arquivo package.json é criado. Este arquivo contém as
informações de identificação, dependências e outras informações do
módulo recém criado como nome, versão, descrição, tipo de licença e
autor, além de contar com seções específicas, como a main, que
estabelece o ponto de entrada para execução de código e scripts, que
guardam scripts para serem executados no ponto de entrada, sem a
necessidade de repetição via terminal.
Para criação da API RESTFul, utilizando o módulo Express, basta que
este seja requerido com a sintaxe require e inicializado. Em seguida,
sabendo o método HTTP correspondente, utilize-o como método da
variável express inicializada. O exemplo abaixo demonstra a criação de
uma API RESTful com os métodos principais:
Por fim, após a declaração das rotas, use o método listen, passando como
parâmetro um número inteiro para informar a porta em que a sua API irá
escutar. No exemplo dado, utilizou-se a porta 3000.
Para conferência completa do código-fonte, acesse o repositório no
GitHub disponível em: <https://github.com/rodrigoogh/descomplica-
aula03-nodejs.git>. No seu terminal, clone o repositório e execute yarn ou
npm install para instalar as dependências. Por fim, para executar o projeto,
use o comando yarn dev ou npx dev. Quando executado, acesse o
navegador com a URL http://localhost:3000 para ver o resultado da rota
GET.
Utilizando o navegador, é possível apenas, diretamente pela URL
acessamos recursos via método GET. Mas, e enquanto aos demais
métodos? Pois então, para isto, utiliza-se a ferramenta Insomnia. Com ela,
é possível realizar requisições HTTP em seus demais métodos,
possibilitando também que o usuário informe parâmetros, bastando
apenas preencher os dados em uma interface simplificada para testar os
endpoints da API. Um exemplo preenchido abaixo demonstra o resultado
esperado:
Parâmetros e Rotas
Para cada método HTTP utilizado, pode-se utilizar parâmetros para envio
de informações, são eles:
1. Request Body
a. Geralmente utilizados nos métodos POST/PUT/DELETE, onde
informações são enviadas no corpo da requisição nos mais diversos
formatos: FormData ou JSON, por exemplo.
b. Para que o Express “entenda” que você irá trabalhar com JSON
no corpo da requisição, a função use é utilizada.
c. Dentro do objeto request, o atributo body contém todo o corpo da
requisição recebida.
2. Route Params
a. Geralmente utilizados nos métodos GET/POST/PUT/DELETE,
onde espaços específicos da URL fazem parte de uma composição
de dados que serão enviados, geralmente identificam um recurso.
b. Ao especificar uma rota, determine um parâmetro de rota
prefixando com o caractere “:” (dois pontos). Você pode ter quantos
forem necessários.
c. Dentro do objeto request, o atributo params contém todos os route
params recebidos.
3. Query Params
a. Geralmente utilizados nos métodos GET, onde estes parâmetros
podem informar filtros em consultas, por exemplo.
b. Dentro do objeto request, o atributo query contém todos os query
params recebidos. Na URL, o primeiro é prefixado com o caractere
“?”, os demais, com “&”.
Além dos parâmetros em rotas, através da API é possível retornar códigos
HTTP para informar os status das respostas. Estes códigos representam
estados, que podem ser:
1. Informational responses (100–199)
a. Status apenas de informação.
2. Successful responses (200–299)
a. Status de sucesso das respostas.
3. Redirects (300–399)
a. Status de redirecionamento.
4. Client errors (400–499)
a. Status de erro do cliente.
5. Server errors (500–599)
a. Status de erro do servidor.
A faixa de variação entre os estados você pode conferir no documento de
especificação da seção 10 da RFC2616, disponível em:
<https://developer.mozilla.org/en-US/docs/Web/HTTP/Status>.
Middlewares
Um middleware é uma função executada durante o ciclo de vida de uma
requisição no servidor Express que pode interrompê-la ou modificá-la. Os
middlewares, pelo fato de interceptarem uma requisição, também
recebem os objetos request e response e contam com um terceiro
parâmetro, que é uma função a ser executada após o processamento do
middleware. Se não informada, a requisição não será processada.
Todos os middlewares devem ser declarados antes das rotas e podem ser
utilizados de três formas:
1. Globalmente, sendo aplicado a todas as rotas.
a. Exemplo: app.use(meuMiddleware).
2. Aplicado a um conjunto de rotas.
a. Exemplo: app.use(‘/minha_rota’, meuMiddleware).
3. Separadamente, atuando como parâmetro dos métodos da rota.
a. Exemplo: app.post(‘/minha_rota’, meuMiddleware, (request,
response) => {...});
Seus casos de uso podem ser:
1. Validação de informações enviadas
2. Monitoramento de requisições
3. Processamento de dados
a. Upload de arquivos
b. Integração com bancos de dados
Atividade extra
A atividade de desenvolvimento para back-end, isto é, a parte do
desenvolvimento “por trás dos panos”, onde o usuário não vê, é uma
tarefa tão importante quanto o front-end. Definir APIs e garantir que as
boas práticas de identificação de recursos e definição de rotas pode se
tornar cansativo. Dessa forma, gostaria de apresentar o módulo Express
Generator. Com ele, é possível criar automaticamente um esqueleto para
sua aplicação sem a necessidade de repetir códigos e arquivos. Está
disponível no endereço: <https://expressjs.com/pt-
br/starter/generator.html> para consulta de sua documentação.
Referências Bibliográficas
•
Web Services Architecture. Disponível em:
<https://www.w3.org/TR/2004/NOTE-ws-arch-20040211>. Acesso em:
11 de abr. de 2021.
•
Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content.
Disponível em: <https://tools.ietf.org/html/rfc7231>. Acesso em: 11 de
abr. de 2021.
•
Express. Disponível em: <https://expressjs.com>. Acesso em: 11 de abr.
de 2021.
•
Nodemon. Disponível em: <https://nodemon.io>. Acesso em: 11 de abr.
de 2021.
Insomnia. Disponível em: <https://insomnia.rest>. Acesso em: 11 de abr.
de 2021.
Ir para questão