Escolar Documentos
Profissional Documentos
Cultura Documentos
DE E-COMMERCE
Sorocaba
2021
VINÍCIUS RODRIGUES DE SOUSA
COMMERCE
Sorocaba
2021
AGRADECIMENTOS
Agradeço aos meus pais e irmã, por tornarem esse sonho de cursar uma universidade
pública possível e pela força que me deram ao longo dessa jornada, e a toda minha família, que
muito me incentivou ao longo do curso.
Agradeço ao Prof. Dr. Galdenoro Botura Júnior pela oportunidade de realizar este
projeto e por se mostrar disposto a me orientar para que fizesse o melhor trabalho possível.
Aos parceiros da República HM, que foram fundamentais no meu processo de
amadurecimento ao longo dos anos na universidade e cuja convivência fez com que estes
fossem os melhores anos da minha vida.
Aos meus amigos de Campinas, que continuaram presentes mesmo depois de cada um
ter ido para um lugar diferente.
Ao meu coordenador de estágio Razuk Jorge e toda a equipe do Middle Office do Itaú
Unibanco pela oportunidade e confiança no meu trabalho como estagiário de desenvolvimento.
Ao meu coordenador Robson Ribeiro, da área de Engenharia de Contas e Tarifas do
Itaú Unibanco, por confiar no meu trabalho e sempre exigir o meu melhor.
Por fim, a todos os funcionários, docentes e discentes da Unesp Sorocaba, que de
alguma maneira me ajudaram ao longo da minha formação.
RESUMO
O comércio eletrônico tem evoluído conforme o avanço dos serviços digitais, permitindo aos
microempreendedores expor seus produtos nas plataformas de venda de grandes varejistas
(marketplaces). Uma forma de dar autonomia aos pequenos lojistas na hora de realizar esta
exposição é fornecendo uma aplicação que permita a realização de operações de cadastro,
atualização, consulta e remoção de seus produtos na base de dados da empresa parceira.
Pensando nesse cenário e no crescente uso de APIs como forma de integração de plataformas,
bem como a necessidade de um monitoramento constante desse tipo de aplicação em tempo
real, foi proposto para este trabalho o desenvolvimento de uma API, na arquitetura REST, que
realizasse operações relacionadas aos produtos de um fornecedor, bem como um painel de
monitoramento da aplicação na nuvem, em tempo real. As regras de negócio do projeto foram
definidas, bem como o contrato da aplicação, desenvolvida a partir de uma arquitetura modular,
com o objetivo de contribuir para organização do código, aumentando sua performance. Para
as informações de produtos e fornecedores, foi criado um banco de dados relacional na
plataforma MySQL, enquanto que, para o armazenamento do token utilizado para autenticação
do fornecedor, foi criado um banco de dados não-relacional no Redis. Foi possível integrar a
aplicação aos bancos de dados e a plataforma de monitoramento Loggly, na nuvem, que
proporcionou a criação de gráficos de diferentes tipos a partir dos eventos de log enviados pela
aplicação para um acompanhamento em tempo real das requisições. Esta ferramenta se mostrou
eficiente para prover uma atuação mais rápida dos responsáveis pela manutenção da API em
casos de indisponibilidade sistêmica e erros no consumo da aplicação, possibilitando também
um contato mais rápido com o cliente nesses casos.
1. INTRODUÇÃO ......................................................................................................... 1
2. CONCEITUAÇÃO .................................................................................................... 3
2.4. Domain-Driven-Design....................................................................................... 6
3. LEVANTAMENTO BIBLIOGRÁFICO................................................................. 13
4. METODOLOGIA .................................................................................................... 17
5.3.2. Alerta.......................................................................................................... 45
6. CONCLUSÕES ....................................................................................................... 47
REFERÊNCIAS ........................................................................................................... 49
1
1. INTRODUÇÃO
1.1. Justificativa
Com o advento da era digital no final do século XX, as empresas de comércio varejistas
tem reformulado o conceito desta atividade econômica, investindo em plataformas eletrônicas
para a realização da compra e venda de bens e serviços. O comérco eletrônico, ou e-commerce,
como é chamado, tem evoluído cada vez mais, se tornando a maneira mais usual de
comercializar produtos ou serviços.
Assim, empresas já consolidadas no ramo do varejo que aderiram a essa transformação
passaram a comercializar produtos de diversos lojistas parceiros que não possuem estrutura
suficiente para a construção de sua própria plataforma digital.
Deste modo, os pequenos lojistas conseguem alcançar milhares de visualizações em
seus produtos, aumentando suas vendas, enquanto os grandes varejistas (os chamados
marketplaces), ampliam seu portfólio de produtos e recebem uma comissão das vendas e o
comprador final que possui mais variedade na hora de realizar suas compras.
Assim sendo, para garantir que este fluxo de informações entre os lojistas e o
marketplace ocorra de maneira estável e contínua, garantindo que o cliente final possua sempre
a informação de maneira rápida e confiável, são necessárias integrações digitais que
possibilitem aos lojistas o maior controle e liberdade possível ao expor seus produtos.
A API, (Application Programming Interface, ou, em português, Interface de
Programação de Aplicações), é uma tecnologia baseada em um conjunto de rotas e padrões de
progamação estabelecidos por uma aplicação, permitindo sua integração com diversos sistemas
e plataformas diferentes.
No cenário do e-commerce, as APIs tem sido adotadas como solução de integração
digital entre plataformas, possibilitando aos lojistas a requisição de informações relacionadas
a um determinado produto exposto e o cadastro de diversos produtos na plataforma do
marketplace de forma ágil e eficiente.
Uma vez que trata-se de uma aplicação que realiza a conexão de sua base de dados com
informações dispostas por terceiros constantemente, é necessário um acompanhamento
contínuo da aplicação para atuar em possíveis instabilidades o mais rápido possível.
Atualmente, em grande parte das empresas de tecnologia, este processo acontece de forma
mais reativa e menos proativa, em que os profissionais da TI são obrigados a analisar diversos
2
relatórios de eventos de log para poder atuar em instabilidades, demandando tempo e esforço.
Assim, o uso de ferramentas interativas baseadas em dashboards que coletam os registros de
log das aplicações automaticamente podem garantir um acompanhamento contínuo do estado
da aplicação, diminuindo o tempo e esforço necessário para identificar os possíveis erros nos
sistemas de TI.
Ao mesmo tempo, estas aplicações estão sempre passíveis de serem alteradas, sendo
necessário que sempre sejam documentadas e que essa documentação possa ser facilmente
acessada pela equipe que atue na sua manutenção.
1.2. Objetivos
2. CONCEITUAÇÃO
2.1. E-Commerce
2.3. API
2.4. Domain-Driven-Design
O banco de dados (BD) pode ser definido como uma coleção de dados relacionados
entre si, dispostos de maneira estruturada, que possibilita o seu acesso de forma eficiente e
precisa. Para a sua operação, são necessários Sistemas Gerenciadores de Bancos de Dados
(SGBD), softwares que surgiram no final da década de 1970.
Com o tempo, foram concebidos diferentes tipos de estruturas de dados para
armazenamento de informações e o SGBDs passaram a adotar diferentes modelos de
representação para desecrevê-las. Atualmente, são utilizados como modelos de base de dados
o modelo em rede, o modelo hierárquico, o modelo relacional e o modelo orientado a objetos
(TAKAI; ITALIANO; FERREIRA, 2005).
A fim de possibilitar consultas e atualizações aos bancos de dados, estes modelos
possuem funcionalidades e operações que os definem de acordo com sua estrutura. No modelo
relacional, são utilizados conceitos como entidades, relacionamentos e atributos. Uma entidade
seria a representação de um objeto do mundo real em um banco de dados, como, por exemplo,
um funcionário. Os atributos, ligados diretamente a entidade, são as propriedades que este
objeto possui, como, por exemplo, o nome e idade de um funcionário. Os relacionamentos são
associações entre as entidades, tais como o relacionamento entre um funcionário e um cliente,
por exemplo (ELMASRI; NAVATHE, 2018).
Os SGBDs podem ser categorizados não apenas a partir do modelo que utilizam, mas
também pelo número de servidores alocados para um banco de dados, por exemplo. Para um
banco de dados disponível em um único ambiente, este é dito centralizado, enquanto que um
banco de dados instanciado a partir de vários servidores é conhecido como distribuído (VICCI,
2014). Em relação aos modelos, os dois mais utilizados atualmente são o modelo relacional e
não-relacional, que serão detalhados nas seções seguintes.
O modelo de dados relacional pode ser definido como um conjunto de relações na forma
da tabelas, em que cada tabela, representando um objeto do mundo real, possui seus atributos
na forma de colunas e um registro deste objeto na forma de linhas. Cada atributo é definido a
partir de um tipo, podendo ser, por exemplo, uma cadeia de caracteres, um ponto flutuante ou
uma sequência de dígitos (SILBERSCHATZ; KORTH; SUDARSHAN, 2012). A Figura 2 a
seguir representa um objeto aluno e seus atributos, contendo cinco registros, em um modelo
relacional de dados.
9
A fim de identificar uma entidade de forma única, um de seus atributos deve ser
escolhido como uma chave, podendo ser simples ou composta. Esta chave também é utilizada
para identificação dos relacionamentos entre entidades, em que uma entidade será dominante
e, a outra, dominada. Assim, ao excluir um registro da entidade dominante, todos os registros
da entidade dominada que são relacionados a este também serão excluídos. Um atributo
designado como chave primária não pode possuir o mesmo valor para mais de um registro
(SILBERSCHATZ; KORTH; SUDARSHAN, 2012).
2.7.1. Loggly
O Loggly, ferramenta baseada em nuvem provida pela Solarwinds, é uma das opções
para monitoramento e gerenciado de logs em tempo real de modo centralizado. Não requer
instalação de nenhum programa e oferece integração com diversas plataformas, bem como
tutoriais para possibilitar o envio de logs das aplicações desejadas para a plataforma. Oferece
um período de 30 dias de gratuidade para emissão de até 10 GB por dia (PICKERING, 2020).
Para sua configuração, basta criar uma conta, especificar a origem dos logs e realizar
os procedimentos de configuração relacionados a tecnologia de envio de logs. No caso de
aplicações Java, deve-se importar o logback, dependência externa que realiza os registros de
logs, e criar um arquivo com a extensão XML para configuração da comunicação da aplicação
com a conta criada.
Assim, é possível realizar pesquisas de logs e criar gráficos de diversos tipos para
coletar os logs apenas utilizando a mensagem emitida pelos eventos, ou até mesmo realizar
operações lógicas entre essas mensagens para filtrar as informações. Também é possível
confeccionar alertas de e-mail baseados nos eventos da aplicação, escolhendo o intervalo de
varredura e a quantidade de ocorrências de eventos que deve disparar os alertas
(SOLARWINDS, 2021). A Figura 5 a seguir ilustra a janela de pesquisa de eventos do Loggly.
3. LEVANTAMENTO BIBLIOGRÁFICO
Foi concluído que a centralização dos logs através da ferramenta utilizada possibilitou
que o monitoramento fosse feito de modo mais ágil e assertivo, diminuindo a perda de dados e
aumentando a segurança da Infraestrutura. A coleta e análise de logs em tempo real para
atuação em falhas, tomadas de decisões e manutenção dos recursos de tecnologia (ROCHA,
2018).
15
4. METODOLOGIA
Para que seja possível a definição de um contrato para a aplicação, deve-se definir as
regras de negócio no contexto do sistema. Assim, pensando em um cenário de E-Commerce,
em que um fornecedor de produtos (cliente da aplicação) deve ser capaz de cadastrar, consultar,
atualizar e remover seus produtos de uma base de dados de uma empresa varejista, foram
definidas as regras a seguir.
Assim, foi possível modelar, na notação RAML, os contratos para cada endpoint da api.
Para a requisição de geração de token do fornecedor, por exemplo, foi escrito o contrato
conforme mostra a Figura 10 a seguir:
20
Caso o fornecedor tente atualizar ou remover um produto que não pertence a ele, será
retornado um status code 403 (proibido), e uma mensagem de erro. Se, ao cadastrar um produto
novo, um fornecedor escolher uma transportadora, forma de pagamento ou centro de
distribuição que não existem na base de dados, será retornado um status code 404 (não
encontrado) e uma mensagem de erro. Caso o cliente faça uma requisição utilizando métodos
ou recursos que não são mapeadas pelo backend da aplicação, será retornado um status code
400. Para erros internos da aplicação ou banco de dados, é retornado um status code 500.
Para contemplar os objetivos pré-estabelecidos para este projeto, bem como as regras
de negócio definidas, foi criado um desenho de solução conforme ilustra a Figura 11. Neste
fluxo, a aplicação é integrada a uma base de dados relacional (MySQL), uma base de dados
não-relacional (Redis) e à ferramenta de monitoramento na nuvem (Loggly), gerando uma
documentação com o uso da ferramenta Swagger.
4.5. Desenvolvimento
Após a criação da instância da base dados MySQL, o modelo lógico foi estruturado,
possuindo os relacionamentos e as chaves primárias conforme mostra a Figura 12 a seguir:
23
Tendo como base a premissa de que o token será armazenado e consultado a partir do
código identificador do fornecedor, foi desenvolvido o modelo lógico conforme mostra a
Figura 13 a seguir, em que o objeto, identificado como Fornecedor, possui como chave o código
identificador do fornecedor e como valor o token, na forma de uma String.
24
Uma vez que cada módulo possui seu próprio arquivo de gerenciamento de
dependências externas (pom.xml), torna-se desnecessário importar uma biblioteca para o
projeto inteiro se esta não for utilizada em todos os módulos. Para fins de organização das
classes de cada módulo, são criados pacotes para agrupar classes de finalidades semelhantes.
Partindo do módulo integration, foi criado um pacote responsável por agrupar as classes
que representam as entidades no banco de dados. Assim, para cada entidade existente no
modelo físico, foi criada sua respectiva entidade na aplicação. Para realizar a associação das
25
entidades com o modelo físico, foram desenvolvidas as interfaces do tipo Repository, que, ao
herdar os métodos da super-classe CrudRepository (dependência externa fornecida pelo pacote
Spring Data), possibilita o gerenciamento das entidades no banco de dados.
Para realizar de fato as operações desejadas no banco de dados, utilizando as entidades
e os repositórios criados, são desenvolvidas as classes do tipo Persistence, responsáveis por
implementar os contratos estabelecidos nas classes de serviço, contidas no módulo domain.
No módulo de negócios (domain), são desenvolvidas as interfaces do tipo Adapter, que
possuem métodos relacionados às regras de negócio, e que são implementados pelas classes de
persistência. Assim, estas interfaces não possuem nenhuma implementação relacionada às
bases de dados, sendo isoladas do módulo de integração. As classes do tipo Service contém as
regras de negócio e realizam a chamada dos métodos das interfaces Adapter.
O módulo de entrega (rest), é responsável por mapear as requisições de cada endpoint,
realizar as validações básicas e a validação do token do fornecedor, para, assim, realizar a regra
de negócio especificada para o endpoint. Para a validação do token, é feita a comunicação com
a classe TokenRedisPersistence, que implementa os métodos de gravação e consulta do token.
A Figura 15 a seguir ilustra a implementação da classe RedisTemplate, alteração e consulta de
valores no banco de dados não-relacional através de uma chave:
Desse modo, pode-se resumir os serviços da aplicação em dois principais fluxo, sendo
estes o fluxo de autenticação e o fluxo de operações. O fluxo de autenticação é ilustrado na
Figura 16, em que, primeiramente, é realizada a consulta ao banco de dados relacional para
criação do token do Fornecedor no banco de dados não-relacional.
26
O fluxo de operações, por sua vez, realizado nas requisições após o usuário já ter se
autenticado com sucesso, é mostrado na Figura 17, em que, primeiramente, é realizada a
consulta ao banco de dados não-relacional para verificação do token do fornecedor, e, em caso
de sucesso, a operação requisitada é realizada no banco de dados relacional.
27
O último módulo para ser desenvolvido é o Application, em que foi criada a classe de
mesmo nome, responsável por inicializar a aplicação em um servidor embarcado. No diretório
de recursos, são realizadas as configurações de banco de dados e da conta da plataforma de
monitoramento, através de um modelo chave-valor.
Com todas as classes desenvolvidas e arquivos de configuração criados, pode-se
construir a aplicação, compactando todos os módulos através do módulo principal, e executar
efetivamente o projeto através de um servidor embarcado, tornando possível a realização das
requisições na API e o acesso à documentação criada via código.
Para inicializar a aplicação no servidor local, foi preciso executar a classe principal do
módulo Application como uma aplicação Java. A partir deste momento, pode-se confirmar a
comunicação entre a API e o Loggly, visualizando todos os logs referentes a aplicação na tela
Search, conforme mostra a Figura 19 a seguir:
Para filtrar os logs nesta tela, utiliza-se uma barra de busca semelhante a da tela de
pesquisa, podendo pesquisar pelo tipo de log e pela mensagem contida neste. É possível criar
gráficos de linha, coluna, área, pizza, ponto, tabelas e valores numéricos, possibilitando um
leque de diferentes tipos de visualização para os eventos. Também pode-se criar queries,
utilizando operadores lógicos (AND, OR, NOT), para relacionar mais de um tipo de log em
uma mesma pesquisa.
Outra funcionalidade importante é a criação de mais de um grupo de evento no mesmo
quadro, para visualização de diferentes eventos no mesmo gráfico, para fins de comparações
rápidas. Ao mesmo tempo, pode-se dividir um mesmo grupo de evento em alguns padrões pré-
estabelecidos pela ferramenta. Além disso, é possível customizar o intervalo de tempo de cada
gráfico, para verificar os logs emitidos ao longo de períodos específicos.
A Figura 20 a seguir mostra um gráfico sem nenhum tipo de filtro (buscando por todos
os logs possíveis que são enviados para a ferramenta de todas as fontes pré-configuradas),
contendo um grupo dividido por nível de severidade, sendo estes informação (INFO), aviso
(WARN) e erro (ERROR):
Para ter uma visão das requisições realizadas aos endpoints de maior relevância, foi
criado um gráfico, na forma de coluna, para cada endpoint da rota de produtos, contendo uma
variável de requisições de sucesso e uma variável de requisições com erro. Nesse caso, foi
utilizada a expressão lógica AND para filtrar os logs emitidos pelo respectivo método
responsável pelo mapeamento do endpoint e a mensagem de sucesso ou erro, como mostra a
Figura 23.
5. RESULTADOS E DISCUSSÃO
Com o token gerado, pode-se realizar a requisição de cadastro de um produto novo para
este fornecedor. Assim, ao realizar uma requisição na rota “/produtos/{idFornecedor}”,
utilizando o método POST, enviando o token como valor do campo “Authorization” no
cabeçalho e, no corpo da requisição, o JSON contendo as informações do produto novo
corretamente preenchidas, obteve-se o seguinte resultado, mostrado na Figura 31.
37
Nota-se que a requisição foi realizada com sucesso, uma vez que obteve-se o JSON
referente ao produto retornado, bem como status code 201, indicando a criação de um recurso
novo. Ao consultar o banco de dados, foi verificado a criação de um produto novo para este
fornecedor, como mostra a Figura 32.
Uma vez que é utilizado o mesmo intervalo de tempo para os três quadros, pode-se
notar que o acompanhamento é efetivo, com o número de chamadas iniciadas igual ao número
de chamadas finalizadas com erro ou sucesso. Desse modo, ao clicar no quadro de
autenticações com erro, a janela de busca é aberta, carregando os objetos retornados de todas
as requisições sem sucesso.
Com o código identificador do fornecedor exibido nas mensagens de erro retornadas, é
possível uma rápida atuação do analista para entrar em contato com o fornecedor que não
consegue se autenticar, ou mesmo identificar se a rota está tentando ser acessada por alguém
que não tem permissão alguma.
Para possibilitar o acompanhamento dos logs de uma forma mais genérica, é utilizado
o gráfico no formato de pizza mostrado na Figura 38 a seguir, que filtra todos os eventos de
41
log recebidos pela aplicação por nível de severidade. Através desse gráfico, pode-se ter uma
ideia geral sobre o estado da aplicação em uma rápida visualização.
Desse modo, pode-se identificar períodos de pico no uso dos bancos de dados para que
sejam disponibilizados mais servidores rapidamente. Pode-se perceber, no gráfico relacionado
ao Redis Server, dois períodos de indisponibilidade (entre 13:45 e 14:00 e entre 15:30 e 15:50),
períodos no qual o servidor foi desligado para analisar o comportamento do gráfico.
Para monitorar as requisições com base no status code retornado, foi desenvolvido o
painel apresentado na Figura 40, que filtra todas as respostas de todos endpoints pelo código
de status retornado. Através dele, pode-se ter uma visão da proporção de chamadas com sucesso
em relação ao total de requisições realizadas.
Também pode-se ter uma ideia da proporção de erros causados por chamadas realizadas
erroneamente (códigos de status 400, 401, 403 e 404) e erros internos do sistema (código de
status 500), possibilitando um melhor direcionamento para atuação nesses casos. Nota-se que
os períodos de indisponibilidade no Redis Server também foram refletidos neste gráfico, nos
períodos em que houve grande quantidade de erros de status 500.
Para monitorar as rotas mais utilizadas pelos consumidores da aplicação, pode-se filtrar
os logs de determinado endpoint por tipo de severidade. Assim, é possível acompanhar serviços
de negócio mais críticos de maneira especial. A Figura 42 a seguir mostra o monitoramento do
serviços de cadastro e atualização de produtos ao longo do tempo.
Nota-se que, no período entre 16:15 e 16:30, em que houve um alto índice de
requisições com erro de cadastro e atualização de produtos, também apresentou um alto índice
de erros 401, 403 e 404, como pode ser visto no acompanhamento de requisições por código
de status. A Figura 43 mostra o acompanhamento das rotas de consultas e exclusões de produtos
ao longo do tempo.
5.3.2. Alerta
Ao realizar algumas requisições com erro na rota de cadastro de produtos, foi recebido
o e-mail conforme mostra a Figura 46, confirmando a importância dessa funcionalidade, que,
aliada aos painéis de visualização, possibilitam uma reação mais rápida nos casos de erros
destes serviços.
Aém do disparo de e-mail, os alertas podem ser enviados a algum endpoint estabelecido
na hora de sua configuração, para abertura de incidentes ou para canais de comunicação
existentes nos ambientes de tecnologia, tais como o Microsoft Teams.
6. CONCLUSÕES
Neste trabalho, foi possível, por meio de uma ideia de negócio e suas necessidades,
propor um desenho de solução de software e implementá-lo com sucesso, realizando a
integração entre diferentes tecnologias, sendo algumas destas em ambiente local e uma em
nuvem.
O modelo de desenvolvimento modular mostrou-se adequado para ser utilizado em
APIs, uma vez que facilita a implementação de regras no módulo de negócios, independente
dos outros módulos, e divide as responsabilidades para cada camada da aplicação, tornando-a
mais leve e facilitando sua manutenção. Foi possível aplicar os conceitos de programação
orientada a objetos, tais como encapsulamento e herança, neste modelo de desenvolvimento, e
entender sua importância na manutenção de software.
Pode-se implementar, em uma mesma aplicação, duas tecnologias de bancos de dados
diferentes, mostrando como essas podem se complementar. O MySQL Server mostrou-se uma
escolha adequada para as informações de produtos e fornecedores, dada a necessidade de
relacionamentos entre entidades, precisão de dados e consultas mais customizadas. O Redis
Server pode ser utilizado com sucesso para armazenamento do token, proporcionando
dinamismo em uma consulta que é realizada em todas as requisições providas pela API.
A documentação gerada através do código se mostrou uma ferramenta útil para um
rápido entendimento do contrato da aplicação, facilitando a manutenção do código. No entanto,
para uma explicação mais detalhada das funcionalidades de negócio da aplicação e suas
integrações com outras plataformas, deve-se utilizar outras ferramentas.
A construção do painel de monitoramento da aplicação foi realizada com sucesso,
mostrando como o Loggly possibilita um acompanhamento efetivo e dinâmico, em tempo real,
do estado da aplicação e das tecnologias integradas a esta. Esta ferramenta proporciona uma
atuação mais rápida e tempestiva da equipe de desenvolvimento em casos de instabilidade do
sistema e de erros dos consumidores da aplicação. A ferramenta também pode ser utilizada pela
equipe de negócios, para monitorar a utilização de cada serviço da API pelos clientes, mantendo
um contato mais próximo com estes.
No geral, este trabalho serviu como uma oportunidade para aplicação dos
conhecimentos do aluno na área de computação aprendidos ao longo do curso, bem como
outras disciplinas relacionadas a lógica. Também mostrou-se como uma chance para buscar
conhecimentos de recursos modernos que são utilizadas no mercado de tecnologia da
informação.
48
REFERÊNCIAS
CARMO, H. V. do. O que você está fazendo com seus logs? Imaster. Disponível em:
<https://imasters.com.br/aws/o-que-voce-esta-fazendo-com-seus-logs>. Acesso em: 30 mar.
2021.
MASSE, M. REST API Design Rulebook: Designing Consistent RESTful Web Service
Interfaces. [S.l.]: "O’Reilly Media, Inc.", 2011.
MORO, T. D.; DORNELES, C.; REBONATTO, M. T. Web services WS-* versus Web
Services REST. Instituto de Ciências Exatas e Geociências, Universidade de Passo Fundo
(UPF), 2011. Disponível em: <https://seer.ufrgs.br/reic/article/view/22140/12928>. Acesso
em: 28 mar. 2021.
50
VICCI, C. Banco de dados. 1º Edição. São Paulo, SP. Person Education do Brasil. 2014.