Se você desenvolve APIs robustas e de alta performance em Delphi ou Lazarus, com certeza já conhece ou utiliza o Horse. Hoje, trazemos uma novidade incrível e muito aguardada pela comunidade que acaba de ser integrada oficialmente ao Core do framework: os Lifecycle Hooks (Ganchos de Ciclo de Vida)!
Inspirado em padrões consolidados de ecossistemas web modernos (como Fastify e Express), o Horse agora oferece 5 momentos distintos no pipeline de execução de uma requisição. Isso abre portas para você plugar regras de auditoria de dados, caching inteligente, criptografia de payloads, monitoramento de latência e muito mais, mantendo sua aplicação limpa e altamente manutenível.
O que mudou? O Ciclo de Vida da Requisição
Os Lifecycle Hooks dividem o pipeline de tráfego de dados em cinco etapas cronológicas e cooperativas operadas em padrão CPS (Continuation Passing Style):
onRequest: Executado no instante em que a requisição física entra no servidor, antes de qualquer processamento ou análise de middlewares globais. Ideal para auditorias brutas, validação de tokens e bloqueios preliminares.preParsing: Dispara imediatamente antes de os dados do corpo (body) da requisição passarem pelo pipeline de tradução (parsers) de middlewares nativos.preValidation: Disparado dinamicamente assim que o Horse identifica a rota ativa, mas antes de o endpoint ou middlewares locais da rota executarem. Excelente para validação de dados de DTOs e privilégios específicos do endpoint.onSend: Intercepta a resposta física (seja string ou array de bytes) logo antes de ela ser despachada para o socket de rede, permitindo ler e até modificar o payload in-place. Perfeito para assinatura digital ou criptografia in-transit.onResponse: Executado em 100% dos cenários dentro de um blocotry..finallycentralizado no roteador. Garante a execução final para auditoria de métricas e encerramentos, sendo totalmente provider-agnostic (Indy, HttpSys, IOCP, CrossSocket, CGI, Apache, ISAPI, etc.).
Quais são os ganhos práticos no seu dia a dia?
Para quem programa no dia a dia, a adição de Lifecycle Hooks traz benefícios muito claros na arquitetura e eficiência do projeto:
- Eliminação Drástica de Boilerplate (Código Repetitivo): Em vez de declarar middlewares de validação ou auditoria de forma manual em cada rota ou grupo de rotas, você pode configurar um gancho global uma única vez que intercepta de forma automatizada todas as requisições em trânsito.
- Perfeita Separação de Conceitos (Clean Code): O código do seu endpoint passa a focar estritamente na regra de negócio (ex: buscar no banco de dados e devolver um registro), enquanto o tratamento transversal de dados (como autenticação, logging, formatação ou criptografia) fica isolado nos ganchos correspondentes.
- Criação de Middlewares Muito Mais Poderosos: Agora desenvolvedores podem criar soluções avançadas de cache ou segurança. Um middleware de caching, por exemplo, pode interceptar no
onRequeste, caso os dados já estejam cacheados, retornar a resposta imediatamente (pulando toda a cadeia de execução de rotas e poupando conexões de banco de dados). - Segurança e Estabilidade Concorrente: Como o tráfego dos hooks foi projetado com padrão CPS thread-safe no Core do framework, você ganha estabilidade e isolamento de estado sob ambientes concorrentes de alto tráfego (sem risco de vazamentos de dados entre requisições de threads paralelas).
E a Retrocompatibilidade? (Zero Breaking Changes)
Como Arquiteto de Software, a maior preocupação ao introduzir uma nova capacidade no Core é não quebrar o legado da comunidade. A implementação foi projetada sob uma diretriz rígida de Zero Breaking Changes:
- Se você atualizar o Horse hoje no seu projeto e não registrar nenhum gancho, a sua aplicação compilará e funcionará com 100% da velocidade e comportamento originais. A execução é limpa e ignora chamadas redundantes de forma transparente (zero-overhead).
- As assinaturas de classes consolidadas como
THorseRequest,THorseResponsee a estrutura de middlewares tradicionais foram totalmente preservadas.
Como usar no dia a dia?
A sintaxe é limpa e intuitiva, seguindo os padrões consagrados de escrita de código do Horse. Veja um exemplo clássico de console aplicando os ganchos:
program ConsoleLifecycleHooks;
{$APPTYPE CONSOLE}
uses
Horse,
System.SysUtils;
begin
// 1. onRequest - Auditoria de entrada
THorse.AddOnRequest(
procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)
begin
Writeln('-> Requisição recebida para: ' + Req.PathInfo);
Next;
end);
// 2. preValidation - Validação pré-endpoint
THorse.AddPreValidation(
procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)
begin
Writeln('-> Validando privilégios para a rota ativa...');
Next;
end);
// 3. onSend - Modificar body da string em trânsito
THorse.AddOnSend(
procedure(const Req: THorseRequest; const Res: THorseResponse; var AContent: string)
begin
AContent := AContent + ' (Assinado pelo onSend)';
end);
// Rota de teste
THorse.Get('/ping',
procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)
begin
Res.Send('pong');
end);
THorse.Listen(9000);
end.
Ao realizar um GET na URL http://localhost:9000/ping, a saída física no console mostrará o ciclo de vida rodando perfeitamente e o payload final recebido no cliente HTTP será pong (Assinado pelo onSend)!
Links Úteis e Documentação Oficial
O recurso já está documentado de forma completa e bilíngue (Português/Inglês) na wiki do repositório oficial:
- Projeto Oficial no GitHub: Repositório HashLoad/horse
- Documentação em Português: Guia Oficial de Lifecycle Hooks
- Exemplos de Código (Lazarus e Delphi): Pasta de Samples do Horse
Atualize já o Horse na sua máquina pelo Boss ou clonando a branch master, teste as novas possibilidades e comente aqui no blog o que achou da novidade!
Descubra mais sobre Régys Borges da Silveira
Assine para receber nossas notícias mais recentes por e-mail.
Dê-nos sua opinião, seu comentário ajuda o site a crescer e melhorar a qualidade dos artigos.