Classe API
Chapter 3
Olá! No capítulo anterior, sobre Componentes Vue (Vue Components), vimos como construímos as peças visuais da nossa interface, como o cartão que exibe nosso "Centro Cultural Vila das Artes". Mas ficou uma pergunta no ar: como esses componentes conseguem os dados das Entidades para mostrar? E quando preenchemos um formulário, como esses dados são enviados para serem salvos no servidor?
É aqui que entra a nossa Classe API, o nosso "carteiro" digital!
Para que serve a Classe API?
Imagine que a interface do usuário (os Componentes Vue) e o servidor (onde os dados realmente moram) falam "línguas" diferentes e vivem em casas separadas. A interface precisa pedir informações ("Ei, me traz os dados do Centro Cultural Vila das Artes!") ou enviar pacotes ("Aqui estão os novos dados para salvar!"). O servidor, por sua vez, processa esses pedidos e envia respostas ("Aqui estão os dados!" ou "Ok, salvo com sucesso!").
A Classe API é a responsável por fazer essa comunicação acontecer de forma eficiente e organizada. Ela funciona como um carteiro ou um garçom:
- Pega o Pedido: Quando um Componente Vue precisa de dados ou quer salvar algo, ele entrega o pedido para a Classe API.
- Leva até o Servidor: A Classe API traduz esse pedido para a "língua" da internet (requisições HTTP como GET, POST, PUT, DELETE) e o envia para o endereço certo no servidor.
- Busca a Resposta: Ela espera o servidor processar o pedido e trazer a resposta.
- Entrega de Volta: A Classe API entrega a resposta de volta para o componente que fez o pedido.
Além disso, nossa Classe API é esperta! Ela também:
- Abstrai a Complexidade: Esconde os detalhes técnicos chatos das requisições HTTP. O componente não precisa saber exatamente como montar um cabeçalho
POSTouGET. - Gerencia um "Cache": Guarda uma cópia temporária das Entidades que já foram buscadas recentemente. Se pedirmos a mesma coisa de novo, ela pode entregar a cópia local (cache) em vez de ir buscar tudo de novo no servidor, tornando tudo mais rápido!
- Organiza Listas: Ajuda a gerenciar as listas de entidades que buscamos (por exemplo, uma lista de todos os espaços culturais).
Nosso Caso de Uso: Como o Componente Vue que mostra a página de detalhes do nosso "Centro Cultural Vila das Artes" (que criamos no Capítulo 1 e exibimos no Capítulo 2) busca as informações completas desse espaço no servidor? Ou como o formulário de edição envia as alterações para serem salvas? É a Classe API que faz essa mágica acontecer!
Entendendo a Classe API
Vamos detalhar as responsabilidades do nosso carteiro digital:
-
Comunicação HTTP: O coração da Classe API. Ela sabe como "conversar" com o servidor usando os verbos padrão da web:
- GET: Usado para buscar dados (Ex: "Me traga os dados do espaço com ID 123").
- POST: Usado para criar novos dados (Ex: "Salve esta nova entidade de evento").
- PUT / PATCH: Usados para atualizar dados existentes (Ex: "Atualize o nome deste espaço").
PATCHé geralmente usado para atualizações parciais (só o que mudou). - DELETE: Usado para remover dados (Ex: "Exclua este agente").
-
Abstração: Em vez de escrevermos código complexo de
fetch(a função nativa do navegador para fazer requisições) toda vez, usamos métodos mais simples da Classe API, comoapi.find()ouapi.persistEntity(). -
Cache de Entidades (
useEntitiesCache): Imagine uma pequena agenda onde a API anota os dados das entidades que já buscou. Se pedirmos a entidade de ID 123 e ela já estiver na agenda (cache), a API entrega na hora! Isso economiza tempo e recursos. Essa "agenda" é gerenciada por uma ferramenta chamada Pinia (um gerenciador de estado para Vue). -
Gerenciamento de Listas (
useEntitiesLists): Similar ao cache, mas para listas. Se buscamos "todos os eventos de música", a API pode guardar essa lista específica. Isso ajuda componentes que exibem essas listas a se manterem atualizados. Também usa Pinia. -
Instâncias por Tipo/Escopo: Geralmente, criamos uma instância da Classe API para cada tipo de Entidade (
space,agent,event, etc.). Isso ajuda a manter as coisas organizadas (new API('space')para lidar com espaços,new API('event')para eventos).
Usando a Classe API na Prática
Normalmente, você não vai usar a Classe API diretamente dentro dos seus Componentes Vue para tudo. Lembra da classe Entity do Capítulo 1? Ela já usa a Classe API por baixo dos panos para métodos como save(), delete(), publish(), etc.
Exemplo 1: Salvando nossa Entidade (Revisitado)
Quando fizemos isso no Capítulo 1:
O método meuNovoEspaco.save() internamente faz algo como:
- Obtém (ou cria) uma instância da API específica para 'space':
const api = new API('space'); - Pega os dados modificados da entidade:
const dadosParaSalvar = this.data(true); - Chama o método
persistEntityda API:api.persistEntity(this, dadosParaSalvar);(ondethisé a própria entidademeuNovoEspaco) - A API envia a requisição (
POSTse for novo,PATCHse for atualização) para o servidor. - A API recebe a resposta e a retorna para a entidade, que então resolve a
Promisedosave().
Exemplo 2: Buscando uma Entidade específica
Imagine que queremos carregar os dados do nosso Centro Cultural (vamos supor que ele tem ID 123) para exibir em uma página de detalhes. Dentro do Componente Vue dessa página, poderíamos fazer:
O que acontece aqui?
new API('space'): Criamos nosso "carteiro" especializado em Espaços.apiEspacos.findOne(idDoEspaco): Pedimos ao carteiro: "Vá até o servidor e me traga todos os dados do espaço com ID 123". A API faz a requisiçãoGET, recebe a resposta, cria um objetoEntitycom esses dados e nos entrega. Se a entidade já estivesse no cache, a API poderia retornar a cópia local mais rapidamente.espacoCultural.value = ...: Guardamos a entidade recebida para que o template do Vue possa exibi-la.
Exemplo 3: Buscando uma Lista de Entidades
Se quiséssemos buscar todos os espaços culturais cujo nome contém "Vila", poderíamos usar o método find():
Aqui, apiEspacos.find(query) pede ao carteiro para buscar uma lista de espaços que correspondam aos critérios definidos na query. A API faz a requisição GET adequada, processa a lista de resultados recebida do servidor, transforma cada item em um objeto Entity e retorna o array.
Por Dentro da Classe API
Ok, mas como o carteiro realmente faz seu trabalho? Vamos espiar "debaixo do capô".
O Fluxo Simplificado (para buscar dados com find()):
- Componente Vue: Chama
api.find(query). - Instância da API: Recebe a chamada. Prepara a URL final com os parâmetros da
query(ex:/api/space/find?@select=name&name=LIKE(%Vila%)). - Verifica Cache (Opcional): (Nota:
findgeralmente não usa cache de lista diretamente, masfindOnesim. O cache principal é por entidade individual.) - Requisição HTTP: Usa a função
fetchdo navegador para enviar uma requisiçãoGETpara a URL preparada. - Servidor (Backend): Recebe a requisição, consulta o banco de dados com base nos filtros, e envia de volta uma resposta JSON com a lista de entidades encontradas e metadados (ex: total de itens).
- Instância da API: Recebe a resposta JSON.
- Processamento: Para cada item na resposta:
- Verifica se já existe uma
Entitycom aquele ID no cache (useEntitiesCache). Se sim, a atualiza. Se não, cria uma nova (new Entity(...)). - Popula a
Entitycom os dados recebidos. - Adiciona a
Entityà lista de resultados.
- Verifica se já existe uma
- Retorno: Retorna a lista de objetos
Entitypara o Componente Vue.
Diagrama de Sequência (Busca find()):
Mergulhando no Código (modules/Components/assets/js/components-base/API.js):
-
Construtor (
constructor):Quando fazemos
new API('space'), ele verifica se já existe uma API para 'space'. Se não, cria uma nova, conecta-se aos sistemas de cache (useEntitiesCache) e listas (useEntitiesLists) e guarda a si mesma para ser reutilizada. -
Métodos HTTP (
GET,POST,PATCH,DELETE):Esses métodos são "wrappers" (embrulhos) em volta da função
fetchnativa do navegador. Eles cuidam de montar a URL correta, definir o método HTTP (GET,POST, etc.), configurar os cabeçalhos (Content-Type, etc.) e formatar os dados a serem enviados (body). -
Persistência (
persistEntity):Este método é usado pela classe
Entity(no métodosave()). Ele decide se deve fazer umPOST(para criar) ou umPATCH(para atualizar) com base na existência de um ID na entidade. Ele pega os dados da entidade usandoentity.data()e chama os métodosPOSTouPATCHcorrespondentes. -
Busca (
findOne,find):Os métodos
findOneefindmontam a URL da API com os filtros e seleções desejadas usandocreateApiUrl. Eles chamamthis.GETpara fazer a requisição. Quando a resposta chega, o métodofetchprocessa o JSON: para cada item, ele usagetEntityInstance(que interage com o cacheuseEntitiesCache) para obter ou criar o objetoEntitycorrespondente e o preenche com os dados usandoentity.populate(). Finalmente, retorna a entidade única ou a lista de entidades. -
Cache e Listas (
useEntitiesCache,useEntitiesLists): São definidos usandoPinia.defineStore. Eles basicamente fornecem um objeto (state) para guardar os dados (entidades cacheadas ou listas nomeadas) eactions(funções comostore,remove,fetch) para manipular esses dados de forma centralizada. A classe API usa essas actions para guardar e recuperar entidades do cache.
Conclusão
Neste capítulo, desvendamos a Classe API, nossa ferramenta essencial para a comunicação entre a interface do usuário (Componentes Vue) e o servidor. Vimos que ela funciona como um carteiro ou garçom, levando requisições (buscar, salvar, deletar) e trazendo respostas, enquanto esconde a complexidade das chamadas HTTP.
Aprendemos como ela é usada, muitas vezes indiretamente através da classe Entity (para salvar ou deletar) ou diretamente (com métodos como find e findOne) para buscar dados específicos ou listas. Também entendemos seu papel crucial no gerenciamento de cache (useEntitiesCache) para otimizar o desempenho.
A Classe API é a ponte que conecta o que o usuário vê e interage na tela com os dados armazenados no backend. Sem ela, nossos componentes não teriam como obter ou modificar as informações culturais da plataforma.
Com esse conhecimento sobre como buscar dados, estamos prontos para explorar como implementar funcionalidades mais complexas. No próximo capítulo, mergulharemos na Busca (Search), vendo como combinamos Componentes Vue e a Classe API para criar experiências de busca poderosas e flexíveis para os usuários.
Generated by AI Codebase Knowledge Builder
Esse material é fruto do Programa de Difusão Nacional - Funarte Redes das Artes, realizado pelo Laboratório do Futuro (entidade vinculada à Universidade Federal do Ceará) no ano de 2025.