Olá, estudante! Agora que você já aprendeu sobre back-end e seus ambientes, e, onde codificar através das IDEs, neste momento, vou lhe mostrar a importância das APIs (Application Programming Interface) ou um português ‘Interface de Programação de Aplicativos’. Elas (APIs) desempenham um papel fundamental no desenvolvimento de aplicativos em back-end, pois funcionam como pontes de comunicação, permitindo que diferentes sistemas interajam de forma eficiente e segura. Ao disponibilizar um conjunto de endpoint (endereços de URI – Uniform Resource Identifiers – em que cada um tem um objetivo único) e métodos padronizados, as APIs facilitam a troca de dados e funcionalidades entre aplicativos.
Falando especificamente de back-end, as APIs fornecem uma camada de abstração que permite aos técnicos em desenvolvimento de sistemas acessar recursos e serviços específicos do servidor sem precisar conhecer sua complexidade interna. Essa separação entre a interface e a implementação subjacente é o que torna as APIs tão poderosas e flexíveis. Além disso, as APIs oferecem a possibilidade de escalabilidade e expansão, permitindo que novos recursos sejam adicionados ao back-end sem afetar os clientes que consomem a API. Isso promove a modularidade do sistema e simplifica a manutenção e o desenvolvimento contínuo.
O que achou dessa prévia sobre todo o conteúdo que irei lhe apresentar ao longo desta lição? Nosso objetivo aqui é demonstrar que as APIs desempenham um papel central em qualquer arquitetura de back-end moderna. Elas colaboraram para que os profissionais técnicos em desenvolvimento de sistema possam criar aplicativos mais robustos, interconectados e escaláveis, facilitando a vida tanto dos desenvolvedores quanto dos usuários finais.
Imagine que você, um(a) técnico(a) em desenvolvimento de sistemas esteja trabalhando em uma empresa que fornece um serviço de armazenamento em nuvem. Seu objetivo é criar um aplicativo para dispositivos móveis que permita aos usuários acessar, fazer upload e baixar arquivos armazenados na nuvem. No entanto, durante este trabalho você se depara com um desafio: como garantir que o aplicativo possa se comunicar de forma segura e eficiente com o servidor de armazenamento em nuvem, sem expor a lógica interna e a infraestrutura do servidor?
Aqui é onde as APIs com ênfase em back-end entram em jogo. A empresa de armazenamento em nuvem pode disponibilizar uma API bem projetada e documentada que atua como uma ‘Interface de Programação de Aplicativos’. Ela define um conjunto de endpoints (URIs) e métodos (GET, POST, PUT e DELETE) que permitem que o aplicativo móvel se conecte e interaja com o servidor. Por exemplo, o aplicativo pode usar um endpoint específico para autenticar o usuário e obter um token de acesso, que será usado em todas as solicitações subsequentes para verificar a identidade do usuário.
Através da API, o aplicativo móvel pode oferecer uma experiência de usuário perfeita, sem a necessidade de conhecer a complexidade interna do servidor de armazenamento em nuvem. Além disso, a empresa de armazenamento em nuvem pode atualizar e aprimorar o servidor sem afetar a funcionalidade do aplicativo, desde que a API permaneça consistente. Desta forma, podemos compreender que as APIs com ênfase em back-end resolvem o problema de comunicação segura e eficiente entre aplicativos e servidores, permitindo que desenvolvedores construam aplicativos mais poderosos e interconectados, e protegem a infraestrutura e a lógica interna do servidor.
Na lição de hoje, irei apresentar um case fictício sobre a empresa Tech Sales que atua no setor de tecnologia e oferece uma plataforma de gerenciamento de vendas para pequenas e médias empresas. A plataforma auxilia os clientes a acompanhar suas vendas, estoques e relatórios de desempenho em tempo real, proporcionando uma visão abrangente de seus negócios.
O grande desafio enfrentado pela Tech Sales era de fornecer uma experiência unificada e eficiente aos seus clientes, integrando-se com diversos sistemas de pontos de vendas (PDVs) e marketplaces. Cada um desses ‘sisteminhas’ tinha sua própria estrutura de dados e formas de autenticação, tornando a integração complexa e demorada para cada novo cliente que se conectava à plataforma.
Para superar esse desafio, a equipe de desenvolvimento implementou uma API robusta e escalável com ênfase em back-end que serviria como uma interface de programação de aplicativos para facilitar a integração com os diversos sistemas de PDVs e marketplaces dos clientes.
Com endpoints bem definidos para sincronização de vendas, atualização de estoques e geração de relatórios, bem como uma autenticação por tokens e autorização granular, a Tech Sales experimentou um aumento significativo na eficiência e na satisfação do cliente. Os clientes agora podiam integrar suas lojas físicas e virtuais à plataforma de gerenciamento de vendas de forma rápida e segura.
Neste exemplo apresentado, fica muito claro como as APIs realmente auxiliam os desenvolvedores, não é mesmo? Mas, o principal é compreender como utilizá-las, portanto, vamos lá?
Interface de Programação de Aplicativos em português é um conjunto de regras, protocolos e ferramentas que permite que diferentes softwares interajam e se comuniquem entre si. Ela define os métodos e formatos de dados que os aplicativos podem usar para solicitar e compartilhar informações, funcionalidades e recursos de um sistema específico, como um serviço web, biblioteca ou plataforma. Segundo AWS (2023), as APIs são mecanismos que permitem que dois componentes de software se comuniquem usando um conjunto de definições e protocolos.
A API atua como uma camada intermediária que permite que aplicativos consumidores (clientes) interajam com aplicativos provedores (servidores) de forma padronizada e segura. Ela abstrai a complexidade subjacente do provedor, permitindo que os desenvolvedores acessem apenas funcionalidades e dados necessários para suas aplicações, sem precisar conhecer os detalhes internos do sistema.
Além disso, são essenciais para a interoperabilidade de sistemas, que é a capacidade de fazer com que dois ou mais sistemas se comuniquem e compartilhem informações de maneira eficiente. Elas são amplamente utilizadas em diferentes domínios, como desenvolvimento web, mobile, IoT, cloud computing, entre outros, e são fundamentais para a criação de ecossistemas tecnológicos ricos e interconectados.
Segundo Martin (2020), a palavra arquitetura é usada no contexto de algo em um nível mais alto e que independe dos detalhes dos níveis mais baixos. Sendo assim, pode-se dizer que a arquitetura se refere à estrutura geral de um sistema complexo, com o objetivo de garantir que todas as partes do sistema trabalhem juntas de forma eficiente e coerente para atingir seus objetivos. No contexto de desenvolvimento de software, a arquitetura se concentra em projetar e definir a estrutura, componentes e interações de um sistema de software. Quando bem projetada deve abordar questões como a divisão de responsabilidades entre os componentes do sistema, a forma como eles se comunicam e como os dados fluem entre eles. A escolha da arquitetura certa pode afetar diretamente a escalabilidade, a manutenção, a flexibilidade e a segurança do software.
Já o back-end se refere à parte de um sistema de software que é responsável pelo processamento e armazenamento dos dados, bem como pela lógica de negócios. É a camada não visível pelo usuário final, que lida com todas as operações em segundo plano, como a gestão de banco de dados, autenticação de usuários, processamento de dados e a interação com outros sistemas e serviços. Segundo Marquez-Soto (2022), usuários não técnicos têm dificuldade para ver a conexão direta entre seu trabalho e o aplicativo que eles usam e adoram. Seus componentes trabalham em conjunto para fornecer informações e funcionalidades ao front-end (a interface com o usuário), que é a parte do sistema com a qual os usuários interagem diretamente.
As APIs oferecem diversos benefícios que são fundamentais para o desenvolvimento e integração de sistemas e aplicativos. Em um contexto de back-end, são benefícios proporcionados pelas APIs:
Modularidade: Permitem que o back-end seja dividido em módulos ou serviços independentes, cada um responsável por uma função específica. Essa abordagem facilita o desenvolvimento, manutenção e atualização do sistema, pois cada parte pode ser modificada sem afetar o funcionamento do restante.
Reutilização de código: Ao criar uma API para funcionalidades específicas, os desenvolvedores podem reutilizar esse código em diferentes partes do sistema ou até mesmo em outros projetos. Isso economiza tempo, esforço e promove uma abordagem consistente no desenvolvimento de software.
Escalabilidade: Permitem que o back-end seja escalável, ou seja, capaz de lidar com um aumento no número de requisições e usuários sem comprometer o desempenho. Ao escalar um sistema, basta adicionar mais recursos ao servidor que hospeda a API, sem afetar a interface pública com os clientes.
Interoperabilidade: Promovem a interoperabilidade entre diferentes sistemas. Elas estabelecem um conjunto padronizado de métodos e endpoints que permitem que aplicativos e serviços se comuniquem de forma eficiente e eficaz, independentemente das tecnologias utilizadas em cada lado.
Abstração e detalhes internos: Sendo bem projetada esconde a complexidade e detalhes internos do back-end, permitindo que os clientes se concentrem apenas na utilização das funcionalidades fornecidas por ela. Isso facilita o desenvolvimento, pois clientes não precisam entender a lógica interna do servidor.
Segurança e controle de acesso: Oferecem uma camada adicional de segurança ao back-end, permitindo a implementação de mecanismos de autenticação e autorização. Isso controla quem pode acessar os recursos e funcionalidades do servidor, protegendo dados sensíveis e garantindo que apenas usuários autorizados possam realizar certas operações.
Facilita a integração: Uma API bem documentada facilita a integração com seus serviços, atraindo parceiros e desenvolvedores de terceiros para criar aplicativos ou serviços complementares que ampliem a funcionalidade do sistema.
Os métodos e endpoints são conceitos fundamentais em uma API e são usados para definir ações específicas que podem ser executadas ao interagir com ela. São parte essencial da arquitetura REST (Representational State Transfer), que é amplamente utilizada para projetar APIs web.
Os métodos representam as ações que podem ser realizadas na API em relação a determinado recurso. Em uma API RESTful, os métodos mais comuns são:
GET: Utilizado para recuperar informações de um recurso existente no servidor. Por exemplo, ao fazer uma solicitação GET para a URI “/clientes”, a API retornaria uma lista de clientes existentes.
POST: Usado para criar um recurso no servidor. É comum usar esse método para enviar dados que serão adicionados ao banco de dados ou sistema. Por exemplo, ao enviar uma solicitação POST para a URI “/clientes”, a API criaria um cliente com base nos dados fornecidos.
PUT: Utilizado para atualizar um recurso existente no servidor. Ao fazer uma solicitação PUT para a URI “/clientes/123”, a API atualizaria o cliente com o ID 123 com os dados fornecidos na solicitação.
DELETE: Usado para remover um recurso do servidor. Ao enviar uma solicitação DELETE para a URI “/clientes/123”, a API exclui o cliente com o ID 123 do sistema.
Segundo MDN WEB DOCS (2023), as mais diferentes requisições podem ser utilizadas pelos métodos vistos acima, mas também algumas requisições menos comuns como OPTIONS ou TRACE.
Os endpoints são os URIs específicos que representam os recursos e as ações disponíveis na API. Eles são a interface pela qual os clientes acessam e interagem com os recursos do servidor. Por exemplo, em uma API para gerenciamento de produtos, alguns endpoints podem ser:
GET /produtos: Recupera a lista de todos os produtos disponíveis.
POST /produtos: Cria um produto.
GET /produtos/123: Recupera os detalhes do produto com o ID 123.
PUT /produtos/123: Atualiza os dados do produto com o ID 123.
DELETE /produtos/123: Excluir o produto com o ID 123 do sistema.
Os endpoints são mapeados para ações específicas no servidor e seguem uma convenção de nomenclatura que facilita a compreensão e a utilização da API pelos desenvolvedores.
Os conceitos essenciais em uma API que asseguram a segurança e o controle de acesso aos recursos por ela disponibilizados, são fundamentais para um funcionamento confiável. A autenticação é o processo de verificar a identidade de um usuário ou aplicativo que está tentando acessar a API. Ela garante que somente usuários legítimos possam obter acesso a determinados recursos, ou seja, o objetivo é garantir que os dados e as funcionalidades disponibilizadas pela API sejam acessados apenas por quem realmente tenha permissão. Existem algumas formas de autenticação em uma API, as mais comuns são:
Por token: O cliente recebe um token de acesso válido após fornecer credenciais de login. Esse token é incluído em cada solicitação futura à API para provar a autenticação.
Por chave de API: O cliente recebe uma chave de API que deve ser incluída em cada solicitação. A API verifica a validade da chave para conceder o acesso.
Por OAuth: Um protocolo que permite que os usuários autorizem aplicativos de terceiros a acessar recursos em seu nome sem compartilhar suas credenciais de login diretamente.
Já a autorização está relacionada aos privilégios ou permissões que um usuário autenticado possui para acessar recursos específicos da API. Enquanto a autenticação verifica a identidade, a autorização controla o que um usuário autenticado pode fazer após o login. Existem diferentes níveis de autorização, como:
Acesso de leitura (Read): Permite que o usuário obtenha informações ou leia dados específicos da API, mas não permite a modificação desses dados.
Acesso de escrita (Write): Permite que o usuário modifique ou crie recursos na API.
Acesso administrativo: Permite que o usuário execute ações administrativas, como gerenciamento de usuários ou configurações avançadas.
Os formatos de dados dizem respeito a maneira pelo qual as informações são estruturadas e representadas nas respostas enviadas pelo servidor e nas solicitações feitas pelos clientes. Nas APIs, existem vários formatos de dados comuns, no entanto, os dois mais amplamente adotados são JSON (JavaScript Object Notation) e XML (Extensible Markup Language).
JSON: é um formato de dados leve, legível por humanos e fácil de interpretar tanto por humanos quanto por máquinas. Ele é baseado na sintaxe de objetos JavaScript e é amplamente utilizado em APIs web.
XML: é uma linguagem de marcação que permite definir etiquetas personalizadas para estruturar dados. Embora seja mais verboso em comparação com o JSON, é amplamente usado em algumas indústrias, como web services legados e interação de sistemas corporativos.
A seguir, temos dois exemplos. Na figura 1, temos um exemplo do formato JSON, e na figura 2, temos um exemplo do formato XML, vejamos:
Componente essencial em uma API, a documentação fornece informações claras e detalhadas sobre como a API funciona, quais seus endpoints, métodos suportados, parâmetros de entrada e saída, autenticação necessária e exemplos de uso. Ou seja, a documentação serve como um guia para os desenvolvedores que desejam consumir a API, facilitando a integração e o entendimento dos recursos disponíveis.
O versionamento é uma prática importante em APIs para garantir que as mudanças e atualizações não afetem negativamente os clientes existentes. Quando uma API é lançada e utilizada por diferentes aplicativos ou serviços, é crucial evitar que alterações futuras “quebrem” a funcionalidade das aplicações integradas. Geralmente, o versionamento é feito adicionando um número de versão no caminho (URI) da API. Por exemplo, uma API inicial poderia ser acessada em “https://api.example.com/v1/endpoint”, e uma versão posterior poderia ser acessada em “https://api.example.com/v2/endpoint”.
Para que você tenha uma ideia sobre como é o consumo de uma API de forma simplificada, irei mostrar na lição de hoje como consumir uma API pública do Github, que nos permite acessar informações de repositórios, usuários, problemas, pull requests e muito mais. Como documentação ela tem um usuário clássico da empresa: o Octocat, que é a mascote da empresa, que combina um gato com tentáculos de polvo.
Então vamos lá! Acesse a API do Github. Para isso, você pode simplesmente inserir a URL correta no navegador web de sua preferência. Por exemplo, para obter informações sobre o usuário “octocat”, basta acessar a seguinte URL: “https://api.github.com/users/octocat”.
Fazendo isso você está realizando uma requisição através do método GET, sendo assim, a API do Github responderá com os dados do usuário “octocat” no formato JSON. A resposta exibirá informações como o nome, nome de usuário, localização, quantidade de seguidores e repositórios entre outros dados.
Para essa nossa prática, não é necessário criar nenhum código ou script. Apenas com o uso do navegador web, você pode realizar uma requisição GET e obter dados fornecidos pela API do GitHub diretamente em formato JSON.
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: 26 de jul. 2023
MARQUEZ-SOTO, P. Backend Developer in 30 Days: acquire skills on API Design, Data Management, Application Testing, Deployment, Security and Performance Optimization. 1. ed. London: BPB On-line, 2022.
MARTIN, R. C. Arquitetura limpa: o guia do artesão para estrutura e design de software. 1. ed. Rio de Janeiro: Alta Books, 2020.
MDN WEB DOCS. HTTP, 2023. Disponível em: <https://developer.mozilla.org/pt-BR/docs/Web/HTTP>. Acesso em: 26 de jul. 2023