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
POST
ouGET
. - 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
persistEntity
da API:api.persistEntity(this, dadosParaSalvar);
(ondethis
é a própria entidademeuNovoEspaco
) - A API envia a requisição (
POST
se for novo,PATCH
se for atualização) para o servidor. - A API recebe a resposta e a retorna para a entidade, que então resolve a
Promise
dosave()
.
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 objetoEntity
com 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:
find
geralmente não usa cache de lista diretamente, masfindOne
sim. O cache principal é por entidade individual.) - Requisição HTTP: Usa a função
fetch
do navegador para enviar uma requisiçãoGET
para 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
Entity
com aquele ID no cache (useEntitiesCache
). Se sim, a atualiza. Se não, cria uma nova (new Entity(...)
). - Popula a
Entity
com os dados recebidos. - Adiciona a
Entity
à lista de resultados.
- Verifica se já existe uma
- Retorno: Retorna a lista de objetos
Entity
para 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
fetch
nativa 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étodosPOST
ouPATCH
correspondentes. -
Busca (
findOne
,find
):Os métodos
findOne
efind
montam a URL da API com os filtros e seleções desejadas usandocreateApiUrl
. Eles chamamthis.GET
para fazer a requisição. Quando a resposta chega, o métodofetch
processa o JSON: para cada item, ele usagetEntityInstance
(que interage com o cacheuseEntitiesCache
) para obter ou criar o objetoEntity
correspondente 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.