Desenvolvimento Web com fpWeb Framework


Durante anos, o desenvolvimento Web no Delphi e Lazarus sempre seguiram o antigo padrão Web Broker. Felizmente, estamos vivendo uma nova fase no ambiente Object Pascal.

Unsplash image Photo by Maik Jonietz on Unsplash

Introdução

A tecnologia Web Broker foi apresentada no Delphi 3 em 1997 e desde esse tempo não houve muitas melhorias. Pelo menos, não na parte do arquitetura das aplicações.

O Web Broker é um sistema baseado em Web Modules. Cada Web Module pode ter uma lista de Actions, e cada Action corresponde a uma URL onde você define um evento que será executado.

Eu venho construindo aplicações Web em Object Pascal desde os tempos do Delphi 4~5. Essas aplicações sempre tiveram uma boa performance quando utilizávamos o padrão ISAPI. Entretanto, a arquitetura estava longe de ser a ideal. Na minha opinião, tentaram utilizar a abordagem RAD em um contexto não-RAD. Funcionava, e ainda funciona, mas não era “empolgante” desenvolver tais aplicações.

fpWeb Framework

A implementação atual do fpWeb — framework Web disponível no Free Pascal 3.0.4 — é bem diferente. Eles mantiveram a compatibilidade com o estilo Web Broker antigo, caso você ainda precise dele para sistemas legados, mas nos deram a possibilidade de utilizar um sistema de rotas muito melhor além de podermos compilar nossas aplicações utilizando diferentes tipos de modelos como Standalone, CGI ou FastCGI.

Rotas

Com o novo sistema de rotas não é mais necessário utilizar Web Modules e eventos, basta registrar uma classe ou mesmo uma simples procedure para representar uma ação quando uma determinada URL for acessada.

Além disso, não estamos mais presos às URLs com o padrão /module/action utilizados no padrão Web Broker. No novo sistema, você pode definir e registrar suas URLs do jeito que quiser.

Exemplo. Através da herança, você pode definir uma classe que irá responder a uma determinada URL:

TMyHandler = Class(TRouteObject)
public
  procedure HandleRequest(
    ARequest: TRequest; AResponse: TResponse); override;
end;

initialization
  HTTPRouter.RegisterRoute(
    '/my/route/in/action', rmAll, TMyHandler
  );

A classe TRouteObject faz parte da fpWeb. Utilize essa classe como base para suas classes. É possível utilizar desde uma simples procedure ou até mesmo uma classe que implemente IRouteInterface. Mas, na minha opinião, a melhor opção é utilizar apenas classes por ser o método mais simples e organizado para codificar as rotas.

Standalone, CGI ou FastCGI

A depuração de aplicações Web nunca foi fácil. Uma aplicação ISAPI, por exemplo, é executada no formato multi thread e depurar uma aplicação nesse formato é um desafio.

A fpWeb facilita o desenvolvimento e depuração. Através de diretivas de compilação, você pode determinar o tipo de modelo a ser desenvolvido. Por exemplo, você poderia determinar que o modelo Standalone será escolhido se o depurador estiver ativado.

Exemplo.

{$ifdef STANDALONE}
  fphttpapp,
{$endif}
{$ifdef FCGI}
  fpfcgi,
{$endif}

Standalone é uma aplicação que não precisa de um serviço Apache ou IIS. O próprio executável se registra numa porta (escolhida pelo desenvolvedor) para responder a requisições HTTP. É possível utilizar esse modelo até mesmo em produção — pense em vários serviços sendo executados localmente numa única máquina se comunicando entre si, mas que também podem responder a requisições na rede.

Sendo uma aplicação que não necessita de um servidor Web, é possível depurar facilmente utilizando breakpoints da mesma forma que fazemos em aplicações Desktop.

No entanto, se você tem um servidor Web, a forma mais simples de fazer o deploy para um Apache ou IIS é o formato CGI. Nesse formato o servidor Web irá executar e instanciar sua aplicação a cada requisição feita pelo usuário de forma isolada e segura. É um ótimo modelo para aplicações simples, no entanto não é o mais performático.

Finalmente, o padrão FastCGI une o que há de melhor do modelo ISAPI (multi thread, cache, inicialização rápida) com a segurança do CGI (processos isolados). Para aplicações que realmente necessitam de performance, esse deve ser o padrão a ser escolhido.

Servidores Web permitem muitas configurações para o modelo FastCGI como o número de instâncias que ficarão ativas, quando elas serão desativadas por falta de requisições, etc.

E não pense em apenas servidores Linux. Eu mesmo mantenho algumas aplicações FastCGI em servidores Windows funcionando 24h/dia, sem parar.

Conclusão

O framework fpWeb vem facilitando muito o desenvolvimento Web em aplicações Object Pascal com Free Pascal e Lazarus.

É um framework simples, bem testado e utilizado em produção a muitos anos pela comunidade.

Com o uso de diretivas de compilação fica fácil alternar entre modelos de aplicações, facilitando muito o desenvolvimento e depuração do código.

Até logo.

Posts Relacionados

  • Memória Segura Utilizando Instâncias de Interfaces

  • Classes Mutáveis vs Objetos Imutáveis

  • Implementando Interfaces Utilizando Diferente Assinaturas de Métodos

  • Usando Paths ao invés de Diretivas de Compilação

  • Trabalhando com Exceções em Requisições HTTP

  • Tipo object Continua Vivo

  • Array de Objetos

  • Variáveis Locais Deveriam ter Nomes Curtos

  • Como Dividir e Organizar o Código em Formulários com Muitos Widgets

  • Pascal Deveria ser Modernizado?