Olá, estudante! Na lição de hoje, você aprofundará seu conhecimento em um assunto que já foi mencionado em lições anteriores, que é a API (Application Programming Interface, ou, em português, Interface de Programação de Aplicações). Em nossa última lição, foi abordado o tema na utilização de serviços e APIs na Internet em que a sua atuação é mais como cliente dessas APIs. Agora, você entenderá como construir e como funcionam as APIs do ponto de vista de servidor, ou seja, para que outras pessoas, no caso de API externa, ou outros projetos seus consumam essa API e/ou serviço.
Você conhecerá a API que o React Native disponibiliza para os desenvolvedores e o conceito de APIs Rest. Segundo MDN Wed Docs (2023), REST é um recurso, por exemplo, um documento, que é transferido com seu estado, padronização de operações e formatos bem definidos ou com serviços que se autodenominam RESTful, quando modificam diretamente o tipo de documento, ao invés de desencadear ações em algum lugar. Sendo assim, o objetivo desta lição é apresentar informações a respeito de APIs e como utilizar os eventos da API do React Native, além de falarmos sobre os conceitos de API Rest e sobre como publicar essas APIs uma vez estando disponíveis.
Uma situação que foi um grande problema e gerou muito custo para as empresas foi o fato de que um sistema era construído com toda a regra de interfaces do usuário em somente um projeto. O problema disso era que, quando era necessário expandir os domínios desse sistema — em relação ao software instalado em cada um dos computadores que eram utilizados —, a simples necessidade de se replicar a base de dados e/ou sistema na forma web já era um grande empecilho, pois, de fato, era necessária uma replicação de tudo, regra de negócio, interface, banco de dados etc.
Com o surgimento das APIs, as equipes começaram a criar seus projetos ainda de forma unificada, porém consumindo suas próprias APIs, que foi o conceito amplamente divulgado pela linguagem JAVA, o chamado MVC (Model, View e Controller), em que era possível, por meio de uma API, criar toda a regra de negócio, que se encaixaria no M (modelo) de MVC, e criava-se, então, projeto com o controlador (controller) e com a view (visão) necessária para aquele momento.
Com isso, foi se estabelecendo o padrão utilizado hoje, em que se cria uma API que se conecta com o banco de dados e com o seu projeto desktop, e, se, por exemplo, surgir a necessidade de site/sistema web, basta que você crie o projeto web e consuma da mesma API, ou, então, pensando na questão mobile, crie seu aplicativo que se servirá, também, da mesma origem dos dados. Dessa forma, você garante um padrão dos dados e de regras independentemente do ambiente, incluindo, como já citado anteriormente, o desenvolvimento de aplicativos para dispositivos móveis.
O case fictício apresentado hoje será sobre a empresa Integration Software S.A., que desenvolveu um sistema para gerenciamento de uma rede de supermercados brasileira. O projeto contempla os seguintes requisitos: software desktop instalado nas máquinas do caixa, sistema web para gestão do estoque do supermercado — que pode ser acessado tanto pelo administrativo de uma unidade quando pelo diretor geral da rede, por isso, a necessidade de ser web — e um aplicativo para dispositivos móveis de pedidos diretamente para o cliente.
A equipe designada para esse projeto, logo de cara, percebe que, se fossem criados três softwares em três plataformas diferentes — e, com certeza, com mais de uma linguagem de programação e conjunto de tecnologias, incluindo banco de dados —, o trabalho seria bem maior e, também, os softwares teriam uma manutenção muito complicada, tendo em vista que toda alteração que ocorresse em algum deles deveria ser replicada nos outros dois. Mas, então, qual a solução para isso?
Pensando em uma solução, a equipe optou pela construção de toda regra de negócio e interação com banco de dados. Das três aplicações, os dados seriam manipulados por meio de uma API RESTful e entregues no formato JSON (JavaScript Notation Objects) e, independentemente da tecnologia dos três softwares, a criação e a recuperação dos dados de banco de dados seriam as mesmas.
A equipe demandou grande esforço na construção dessa API e, na sequência, começou a construção do software web de gestão de estoque e, em paralelo, implementou o aplicativo para dispositivos móveis e o sistema do caixa. Assim, pode-se chamar um case de sucesso de utilização de APIs no desenvolvimento de softwares e aplicativos profissionais com o que há de mais atualizado em termos de técnicas e tecnologia interoperabilizante.
Antes de iniciar os conceitos acerca de APIs em geral, abordarei, primeiramente, alguns aspectos, especificamente, o gerenciamento de Eventos, por meio de uma API do React Native para, na sequência, conceituar as APIs de maneira geral e especificar tais conceitos em uma API REST e, como consequência, uma API RESTful e finalizar com a abordagem de publicação dessas APIs.
Dentro dos aspectos de regra de negócio de uma API, existe um tipo de componente/funcionalidade chamado Eventos (Events). Mas o que seria um evento na prática?
Dentro da API do framework React Native, por exemplo, temos um componente chamado AppState, que, segundo React Native (2023), é um componente que pode informar se o aplicativo está em primeiro ou segundo plano e notificá-lo quando o estado muda. Sendo assim, sempre que isso ocorre, o estado da aplicação muda, ou seja, isso significa que, na prática, o aplicativo passou do segundo plano para primeiro, ou, então, do primeiro plano para segundo. O que chamamos de Evento é disparado, notificando toda a aplicação.
Mas quem é ou seria o responsável em escutar essa notificação? Bom, para isso, temos a criação de outros componentes em que a palavra escutar é de grande importância, pois o nome dado a esse tipo de componente, que escuta notificações, é Listener. Sendo assim, a função desse Listener é “ouvir” quando o aplicativo dispara o evento de alteração de estado, para que, quando isso ocorrer, todas as providências necessárias sejam realizadas de acordo com a regra de negócio que você estipular, como salvar todos os dados carregados nos aplicativos ainda não salvos, quando ele sai do primeiro plano para segundo, e, também, recuperar essas informações, digamos, salvas temporariamente, quando o aplicativo sair do segundo plano para primeiro.
Esse conceito é amplamente utilizado em vários frameworks para as mais variadas situações em que tarefas devam ser realizadas por meio de gatilhos ou ações realizadas pelo usuário.
Agora chegou o momento de formalizarmos as devidas apresentações sobre o tema. Mas, verdadeiramente, o que é uma API? Segundo AWS ([2023]), APIs são mecanismos que permitem que dois componentes de software se comuniquem usando um conjunto de definições e protocolos.
Você já sabe que API significa Application Programming Interface (Interface de Programação da Aplicação), pois, em lições anteriores, foi estudado um pouco sobre ela, mas, para que você possa entender melhor, nesse contexto, a palavra Aplicação está se referindo a qualquer software ou qualquer funcionalidade distinta. Dessa forma, pode-se pensar que Interface seria um contrato de serviço entre duas aplicações ou sistemas. Essa questão de “contrato” são as regras que definem como a comunicação entre as duas aplicações ocorrerão — em relação a solicitações/requisições e respostas. Por isso, uma boa API é largamente documentada com essas regras.
As APIs, por natureza, possuem a arquitetura no formato de cliente e servidor. Uma aplicação consumirá dados e informações de outra API, nesse caso, a aplicação que consome será o cliente e a aplicação que provê os dados e as informações servirá o cliente, ou seja, o servidor. Dentro desse formato, existem formas e/ou protocolos que uma API pode estabelecer essa comunicação. Veremos sobre elas a seguir.
São APIs que utilizam do SOAP — chamadas protocolo de acesso a objetos simples, em português —, quando as mensagens são trocadas entre cliente e servidor por meio de arquivos do tipo XML. É um formato um tanto quanto burocrático, muito utilizado no passado, mas, ainda, existe em sistemas legados.
Nas Remote Procedure Calls — chamada procedimento remoto, em português —, o cliente se comunica com o servidor por meio de uma função ou procedimento em que o servidor retorna a saída dessa chamada.
A WebSocket é um conceito mais moderno, usa objetos JSON para transmitir dados. Ela oferece suporte à comunicação bidirecional entre aplicativos cliente e servidor, ou seja, o servidor, também, pode enviar chamadas ao cliente com o objetivo de coletar informações.
São as APIs mais utilizadas hoje no mercado por conta de sua flexibilidade, entre outros fatores. O cliente envia solicitações ao servidor, como dados, e o servidor usa essa entrada do cliente para iniciar funções internas que o cliente não sabe como são processadas e retorna os dados de saída ao cliente.
Já que as APIs REST são as mais utilizadas do mercado, convém detalhar um pouco mais a respeito. Por isso, agora, apresentarei o que significa propriamente a palavra REST.
Segundo AWS ([2023]), REST significa, em português, Transferência Representacional de Estado, que define um conjunto de funções, como GET, PUT, DELETE e assim por diante, que os clientes podem usar para acessar e manipular dados do servidor da API. Nesse caso, ambos, cliente e servidor, trocam esses dados por meio do protocolo HTTP — HyperText Transfer Protocol —, protocolo esse que deu vida à Internet como conhecemos hoje.
Segundo Masse (2011), o documento que deu origem ao termo foi publicado no ano de 2000, por Roy Fielding, em sua dissertação de PhD., com o nome de “Representational State Transfer”, em que ele nomeou e descreveu esse estilo de arquitetura web.
Como já citado anteriormente nesta lição, as APIs REST trocam informações por meio do protocolo HTTP, e as funções citadas, como GET, PUT e DELETE, dentro do conceito de Fielding, são chamados de verbos http, em que cada um serve para uma operação na API.
Você sabia que existem mais verbos? São eles: Connect, Delete, Get, Head, Options, Patch, Post, Put e Trace. Eles podem ser conhecidos clicando aqui.
Os “verbos” mais utilizados para integração com aplicativos para dispositivos móveis são os seguintes:
GET: utilizado para recuperar informações. Sempre que precisar buscar informações, indica-se o uso desse verbo.
POST: utilizado para salvar novas informações no servidor.
PUT: utilizado para atualizar informações já existentes no servidor.
DELETE: utilizado para apagar informações existentes no servidor.
Outra característica de API REST são os “códigos de resposta HTTP” que ajudam na hora de entender se a sua requisição funcionou ou não. Os mais usados são os seguintes:
200 Ok: é a resposta de status de sucesso que indica que a requisição foi bem-sucedida.
201 Created: é utilizado como resposta de sucesso, indica que a requisição foi bem-sucedida e que um novo recurso foi criado.
301 Moved Permanently: indica que o recurso requisitado foi movido, permanentemente, para outro endereço dado pelo cabeçalho Location.
404 Not Found: indica que o servidor não conseguiu encontrar o recurso solicitado.
503 Service Unavailable: indica que o servidor não está pronto para lidar com a requisição.
Uma lista completa com todos os códigos de resposta HTTP pode ser encontrada clicando aqui.
Ainda sobre os códigos de resposta HTTP, segundo MDN Web Docs (2022b), eles indicam se uma requisição HTTP foi, corretamente, concluída. As respostas são agrupadas em cinco classes:
Respostas de informação (100 - 199).
Respostas de sucesso (200 - 299).
Redirecionamentos (300 - 399).
Erros do cliente (400 - 499).
Erros do servidor (500 - 599) .
Gosto muito de ressaltar a importância das duas últimas classes de respostas que dizem respeito a erros. Se você estiver consumindo uma API e, em determinado ponto, ela fica retornando algum erro na faixa de 400, você, como cliente, está fazendo algo errado e, se estiver retornando algum erro na faixa de 500, o servidor está com algum tipo de problema.
Se você analisou e já entendeu que REST é um estilo de arquitetura, ou seja, uma série de restrições que devem ser seguidas no processo de criação de uma API e descritas por Roy Fielding em sua tese de PhD, você já entendeu 80% do conceito RESTful, pois, se a sua API está de acordo com todas as restrições definidas por Roy, sua API, então, é RESTful.
Restrições para uma API RESTful:
É o que permite o desenvolvimento independente da aplicação entre o usuário e o servidor, em outras palavras, manipular os recursos por meio de representações, como JSON ou XML, é uma das condições para o desenvolvimento de uma interface uniforme.
A comunicação feita entre cliente e servidor não deve armazenar nenhuma informação entre as solicitações, não dependendo de informações já armazenadas em outras sessões.
Deve ser desenvolvido para que consiga armazenar dados em cache, pois, assim, as solicitações e as respostas entre cliente e servidor são otimizadas.
Indica uma arquitetura baseada em clientes, em servidores e, também, em recursos, em que as solicitações são feitas via protocolo HTTP.
Cada camada da API deve possuir uma funcionalidade específica, assim, cada camada é responsável por uma etapa diferente dos processos de requisição e resposta.
A questão de publicação de uma API pode ser um tanto quanto simples do ponto de vista de disponibilizá-la internamente para sua empresa, para seu projeto ou, até mesmo, para toda web. Você pode publicá-la de duas maneiras:
Como um projeto normal, com toda a regra de negócio e implantação em ambiente de produção, mas será um projeto sem interface do usuário, em que você terá apenas URIs ou URLs para efetuar as solicitações HTTP.
Utilizar algum gateway de APIs dos vários disponíveis no mercado, como o API Gateway da AWS, que, segundo AWS ([2023]), é uma ferramenta de gerenciamento de APIs para clientes empresariais que usa grande variedade de serviços de back-end. Os gateways de API, geralmente, lidam com tarefas comuns, como autenticação de usuários, estatísticas e gerenciamento de taxas que são aplicáveis a todas as chamadas de API.
Com o conhecimento obtido nesta lição, acredito que fica fácil entender que API é vida! Brincadeiras à parte, na maioria das vezes, você trabalhará com uma API, seja consumindo uma em seu projeto, seja criando uma interna — mas não exclusiva — para seu atual projeto, e pode ser que você, ainda, não precise trabalhar com uma API (raríssimos casos).
Acredito, fortemente, que, se o projeto for alguma versão de apresentação, ou como se chama esse tipo de projeto, MVP (Mínimo Produto Viável, em português), ou seja, uma versão do projeto apenas para provar que seu projeto é válido e capaz de resolver o problema no qual ele se propões e, também, é capaz de captar investimentos para todo o desenvolvimento, você pode ter a opção de construir seu projeto sem necessidade de criar uma API separadamente. Mas, em todas as outras situações, principalmente no que é exposto nesta disciplina, criar uma API para tratar da regra de negócio, principalmente uma API RESTful, agilizará muito seu trabalho em possíveis atualizações e melhorias de seu aplicativo.
Portanto, para aplicar o conceito de APIs, basta que você separe a regra de negócio de seu aplicativo e comunicação com banco de dados em um projeto ou gateway separado e, a partir disso, fique tranquilo(a) para criar todo o design e comportamento da aplicação.
AWS. O que é uma API. [2023]. Disponível em: https://aws.amazon.com/pt/what-is/api/#:~:text=API%20significa%20Application%20Programming%20Interface,de%20servi%C3%A7o%20entre%20duas%20aplica%C3%A7%C3%B5es.. Acesso em: 31 mar. 2023.
MASSE, M. REST API: design rulebook. 1. ed. Sebastopol: O’Reilly, 2011.
MDN WEB DOCS. Rest. 6 nov. 2022a. Disponível em: https://developer.mozilla.org/pt-BR/docs/Glossary/REST. Acesso em: 31 mar. 2023.
MDN WEB DOCS. Códigos de status de respostas HTTP. 6 nov. 2022b. Disponível em: https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Status. Acesso em: 31 mar. 2023.
REACT NATIVE. AppState. 17 mar. 2023. Disponível em: https://reactnative.dev/docs/appstate#events. Acesso em: 31 mar. 2023.