PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 25 → Windev com Supabase : REST API, Authentification et Realtime
Windev com Supabase : REST API, Authentification et Realtime
Started by Boller, May, 21 2025 11:15 PM - No answer
Registered member
4,520 messages
Posted on May, 21 2025 - 11:15 PM
Boa tarde Pessoal,

WinDev e Supabase: API REST, Autenticação e Realtime

No contexto da modernização das arquiteturas de software, cada vez mais equipes de desenvolvimento buscam combinar a robustez de ferramentas tradicionais como o WinDev com soluções modernas em nuvem como o Supabase. Essa combinação pode parecer atípica à primeira vista, mas abre caminho para aplicações híbridas mais ágeis, seguras e escaláveis.

Neste artigo, exploramos as possibilidades oferecidas pelo Supabase, especialmente por meio de suas APIs REST, seu sistema de autenticação integrado, e destacamos as vantagens que isso pode oferecer em comparação com um PostgreSQL clássico usado isoladamente, particularmente em um ambiente WinDev.



O que é o Supabase?

O Supabase é uma plataforma Backend-as-a-Service (BaaS) de código aberto baseada no PostgreSQL. Ele oferece: 
• APIs REST automáticas geradas a partir da estrutura do banco de dados;
• Um sistema completo de autenticação (email, magic link, OAuth, etc.);
• Gerenciamento de funções e políticas de segurança (RLS);
• Armazenamento de arquivos e um console de administração amigável;
• Um mecanismo Realtime integrado para receber instantaneamente alterações nos dados. 

O Supabase se posiciona como uma alternativa de código aberto ao Firebase, com o poder e a confiabilidade de um PostgreSQL enriquecido com funcionalidades modernas. 

Com seu módulo Realtime, o Supabase permite escutar em tempo real as modificações feitas nas tabelas (inserções, atualizações, exclusões) por meio de um canal WebSocket seguro. Isso abre caminho para aplicações reativas, sem a necessidade de interrogar constantemente o banco de dados.



Utilizando as APIs REST do Supabase no WinDev

Um dos grandes atrativos do Supabase reside em suas APIs REST expostas automaticamente. Para um desenvolvedor WinDev, isso significa que é possível interagir com o banco de dados sem nenhum conector nativo do PostgreSQL, simplesmente por meio de chamadas HTTP.

As funções HTTP integradas do WinDev (HTTPRequête, HTTPLitFichier, etc.) permitem facilmente:
• Recuperar dados de uma tabela;
• Inserir ou atualizar registros;
• Gerenciar erros e status HTTP. 

Cada tabela do Supabase torna-se assim um recurso REST, seguro, versionado e imediatamente acessível.

Essa separação entre a aplicação cliente WinDev e o banco de dados permite:
• Acesso remoto sem túnel VPN ou porta aberta;
• Separação de responsabilidades (backend vs cliente);
• Melhor escalabilidade.



Autenticação nativa do Supabase: simplifique a segurança

Graças às APIs do Supabase, é possível integrar:
• Autenticação por email/senha;
• Links mágicos para conexões sem senha;
• Provedores OAuth como Google, GitHub, Microsoft. 

A integração baseia-se em chamadas HTTP POST para os endpoints /auth/v1/token ou /auth/v1/signup. 

Uma vez conectado, o usuário recebe um JWT (token de autenticação) a ser incluído nas requisições futuras. Esse token permite:
• Proteger o acesso aos recursos;
• Definir dinamicamente os direitos por meio das políticas RLS no Supabase;
• Garantir uma autenticação centralizada, sem reinventar a roda no WinDev.

Esse mecanismo torna obsoleta a gestão manual de sessões ou senhas no WinDev, ao mesmo tempo em que oferece uma segurança moderna compatível com o RGPD.



Supabase vs PostgreSQL clássico

O Supabase utiliza o PostgreSQL, mas vai muito além ao simplificar drasticamente a exploração e a segurança.

Aqui está uma comparação clara:

Critério PostgreSQL Clássico Supabase
Implantação Auto-hospedado, manutenção própria SaaS ou auto-hospedado, pronto para uso
API REST Desenvolvida manualmente Geradas automaticamente
Autenticação Implementada separadamente Nativa, OAuth, Magic Link, RLS
Segurança dos dados Requer desenvolvimento Políticas RLS integradas
Integração no WinDev Via conectores PostgreSQL Via HTTP REST (universal e nativo)
Escalabilidade Gerenciada manualmente Automatizada (conforme oferta do Supabase)
Manutenção Requer expertise em DBA Simplificada via console do Supabase

Assim, em vez de utilizar um servidor PostgreSQL puro que exige esforços de administração, segurança e desenvolvimento backend, o Supabase oferece uma camada adicional pronta para uso que facilita drasticamente a implementação de projetos conectados, especialmente em contextos WinDev onde as funções REST são mais flexíveis de implantar do que os conectores nativos SQL.



Escalabilidade: uma alavanca estratégica facilitada pelo Supabase

A escalabilidade é frequentemente um ponto crítico na escolha de uma arquitetura. O Supabase, com sua infraestrutura baseada em nuvem e recursos como APIs REST automáticas, autenticação integrada e políticas de segurança, permite que as aplicações cresçam de forma mais ágil e segura, adaptando-se às necessidades crescentes sem a complexidade de gerenciar servidores e infraestrutura manualmente.



Para mais detalhes, você pode acessar o artigo original no blog da IsiNeva: Windev et Supabase : REST API, Authentification et Realtime. 

https://www.isineva.com/windev-avec-supabase-api-authentification-avantages/



Aqui está uma classe WLanguage (clsSupabaseClient) para integração com Supabase via API REST, cobrindo autenticação e operações básicas (GET, POST, PATCH e DELETE). O foco é usar as funções HTTPRequest, HTTPGetResult e manter segurança via token JWT.



WLanguage Class: clsSupabaseClient

// #########################################################
// Classe: clsSupabaseClient
// Descrição: Cliente REST para Supabase com autenticação JWT
// Autor: Adriano Boller - WX Soluções
// #########################################################

// Classe
CLASS clsSupabaseClient

// Membros privados
PRIVATE
cBaseURL is string
cApiKey is string
cJWT is string

// Construtor
CONSTRUCTOR(sURL is string, sAPIKey is string)
cBaseURL = sURL
cApiKey = sAPIKey
cJWT = ""

END

// Método: Autentica usuário via e-mail e senha
PROCEDURE Login(sEmail is string, sSenha is string)
sJSON is string = [
{
"email":"] + sEmail + [",
"password":"] + sSenha + ["
}
]

HTTPRequest(cBaseURL + "/auth/v1/token?grant_type=password", httpPost, sJSON, "application/json", cApiKeyHeader())

IF HTTPStatus() = 200 THEN
resposta is JSON = JSONToVariant(HTTPGetResult(httpResult))
cJWT = resposta.token
RESULT True
ELSE
Info("Erro na autenticação: " + HTTPGetResult(httpResult))
RESULT False
END

END

// Método: GET - busca dados de uma tabela
PROCEDURE Get(sTabela is string)
HTTPRequest(cBaseURL + "/rest/v1/" + sTabela, httpGet, "", "", jwtHeaders())

IF HTTPStatus() = 200 THEN
RESULT HTTPGetResult(httpResult)
ELSE
Info("Erro ao buscar dados: " + HTTPGetResult(httpResult))
RESULT ""
END

END

// Método: POST - insere dados
PROCEDURE Post(sTabela is string, sJSON is string)
HTTPRequest(cBaseURL + "/rest/v1/" + sTabela, httpPost, sJSON, "application/json", jwtHeaders())

IF HTTPStatus() = 201 OR HTTPStatus() = 200 THEN
RESULT HTTPGetResult(httpResult)
ELSE
Info("Erro ao inserir dados: " + HTTPGetResult(httpResult))
RESULT ""
END

END

// Método: PATCH - atualiza dados com filtro
PROCEDURE Patch(sTabela is string, sFiltro is string, sJSON is string)
sURL is string = cBaseURL + "/rest/v1/" + sTabela + "?" + URLEncode(sFiltro)
HTTPRequest(sURL, httpPatch, sJSON, "application/json", jwtHeaders())

IF HTTPStatus() = 204 THEN
RESULT "Atualização feita com sucesso"
ELSE
Info("Erro ao atualizar: " + HTTPGetResult(httpResult))
RESULT ""
END

END

// Método: DELETE - remove dados com filtro
PROCEDURE Delete(sTabela is string, sFiltro is string)
sURL is string = cBaseURL + "/rest/v1/" + sTabela + "?" + URLEncode(sFiltro)
HTTPRequest(sURL, httpDelete, "", "", jwtHeaders())

IF HTTPStatus() = 204 THEN
RESULT "Remoção feita com sucesso"
ELSE
Info("Erro ao remover: " + HTTPGetResult(httpResult))
RESULT ""
END

END

// Cabeçalho com JWT e API Key
PROCEDURE jwtHeaders()
arrHeaders is array of strings
Add(arrHeaders, "apikey: " + cApiKey)
Add(arrHeaders, "Authorization: Bearer " + cJWT)
RESULT arrHeaders

END

// Cabeçalho somente com API Key
PROCEDURE cApiKeyHeader()
arrHeaders is array of strings
Add(arrHeaders, "apikey: " + cApiKey)
RESULT arrHeaders

END

END




Exemplo de uso:

supabase is clsSupabaseClient("https://xyzcompany.supabase.co", "API_KEY")

IF supabase.Login("usuario@email.com", "senha123") THEN
dadosJSON is string = supabase.Get("clientes")
Info(dadosJSON)
END



Exemplo de uso


Perfeito! Vamos criar um exemplo prático e realista de uso da classe clsSupabaseClient, com um caso de CRUD completo sobre a tabela clientes, simulando um app de cadastro de clientes com Supabase + WinDev, via REST API.



Cenário: App WinDev de Cadastro de Clientes

Você está criando um aplicativo WinDev para gerenciar clientes de uma empresa. O backend está hospedado no Supabase, com uma tabela chamada clientes que possui os seguintes campos:

Campo Tipo
id UUID (PK)
nome text
email text
telefone text
criado_em timestamp




1. Inicialização do Cliente Supabase

// Inicializar a classe com a URL do Supabase e a chave pública do projeto
supabase is clsSupabaseClient("https://xyzcompany.supabase.co", "eyJhbGciOi...")




2. Login do usuário (para obter o JWT)

IF NOT supabase.Login("admin@empresa.com", "senhaSecreta") THEN
Error("Não foi possível autenticar.")
RETURN
END




3. Inserir um novo cliente (POST)

novoClienteJSON is string = [
{
"id":"] + GUIDGenerate() + [",
"nome":"Maria Silva",
"email":"maria@email.com",
"telefone":"(41) 99999-1234",
"criado_em":"2025-05-21T10:00:00Z"
}
]

resultadoPost is string = supabase.Post("clientes", novoClienteJSON)
Info("Cliente inserido com sucesso: " + resultadoPost)




4. Listar todos os clientes (GET)

clientesJSON is string = supabase.Get("clientes")
Info("Clientes cadastrados: " + clientesJSON)




5. Atualizar telefone do cliente (PATCH)

// Filtro: id igual ao UUID do cliente (exemplo fixo)
filtro is string = "id=eq.74f6c9d5-8f5a-4f67-9f3a-a45a8235f900"

atualizacaoJSON is string = [
{
"telefone":"(41) 98888-7777"
}
]

resultadoPatch is string = supabase.Patch("clientes", filtro, atualizacaoJSON)
Info(resultadoPatch)




6. Remover um cliente (DELETE)

filtroExcluir is string = "email=eq.maria@email.com"
resultadoDelete is string = supabase.Delete("clientes", filtroExcluir)
Info(resultadoDelete)




Resumo Visual do Fluxo:
1. Autentica via e-mail/senha e recebe token JWT.
2. Usa esse token para fazer requisições REST (inserção, leitura, atualização e exclusão).
3. Tudo via comandos HTTPRequest, sem conexão direta SQL ou driver.



Vantagens do Uso em Produção
• Alta segurança: autenticação via JWT + política RLS no Supabase.
• Sem conexão direta ao banco: ideal para dispositivos móveis ou clientes leves.
• Alta escalabilidade: backend preparado para milhares de conexões simultâneas.
• Controle completo no WinDev sem depender de conectores SQL nativos.



Bons estudos

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/