CGI é uma antiga forma de programar não proprietária em sua infra-estrutura, como é o ISAPI da Microsoft.
Vamos a algumas particularidades da programação em CGI que o tornam mais conveniente que o ISAPI em determinadas situações.
O ISAPI precisa ser preparado a base de objetos, forma de concepção de programação que exige planejamento anterior. Após o planejamento de métodos e propriedades que o objeto vai ter, é preciso utilizar ferramentas Microsoft de construção e dominar terminologias de construção que mudam de ano para ano e que provocam o advento de ferramentas cada vez mais complexas.
Se você desejar fazer uma aplicação simples de banco de dados e desejar ler um banco de dados em um arquivo TXT com uma certa estrutura, ou um XML, vai ter que dominar os aborrecidíssimos e instáveis objetos Microsoft, e que são portas para invasão, devido à não checagem de invasão de áreas de memória.
O Lazarus Pascal
O Lazarus Pascal, clone quase idêntico 100 % ao Delphi, possui componentes e capacidades já bem construídos em função das numerosas inconsistências do seu semelhante. Instale os dois pacotes do diretório:
<Diretório de Instalação>\Lazarus\Components\fpweb
Os pacotes a serem instalados são (nesta ordem):
weblaz.lpk
lazwebextra.lpk
Utilize a opção do menu:
Package => Open Package file (lpk)
Compile e Instale ambos, NA ORDEM QUE RECOMENDAMOS.
Se tudo correr bem, o Lazarus vai reiniciar.
Primeira versão - Utilizando o objeto TCustomCGIApplication
Inicie um novo projeto do tipo console.
program project1;
{$mode objfpc}{$H+}
uses
Classes, SysUtils, httpDefs, custcgi, custweb
{ you can add units after this };
Type
TMyCGIApp = Class(TCustomCGIApplication)
Protected
function InitializeWebHandler: TWebHandler; override;
end;
TMyCGIHandler = class(TCGIHandler)
public
procedure HandleRequest(ARequest: TRequest; AResponse: TResponse); override;
end;
{$R *.res}
Procedure TMyCGIHandler.HandleRequest(ARequest : Trequest; AResponse : TResponse);
begin
AResponse.Content := '<H1>Hello</H1>';
end;
function TMyCGIApp.InitializeWebHandler: TWebHandler;
begin
Result := TMyCGIHandler.Create(self);
end;
begin
With TMyCGIApp.Create(Nil) do
try
Initialize;
Run;
finally
Free;
end;
end.
Segunda versão - Usando fpweb e o WebModule
Utilize a opção de novo projeto do tipo CGI Application.
A unit gerada nem precisará ser mexida:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, HTTPDefs, websession, fpHTTP, fpWeb, fphtml;
type
{ TFPWebModule1 }
TFPWebModule1 = class(TFPWebModule)
HTMLProducer1: THTMLEntityProducer;
private
{ private declarations }
public
{ public declarations }
end;
var
FPWebModule1: TFPWebModule1;
implementation
{$R *.lfm}
initialization
RegisterHTTPModule('TFPWebModule1', TFPWebModule1);
end.
A única alteração virá como resultado da colocação de um componente THTMLEntityProducer da paleta fpweb.
Selecione o WebModule, e clique em sua propriedade Actions (que inicia com o valor 0 items). Aparece uma caixa de diálogo, onde você deverá pressionar o botão Add. Clicando na nova ação (action) aparecem as suas propriedades no Object Inspector. Clique então em Contents e coloque um trecho de HTML como abaixo:
<H1>HTMLEntityProducer</H1>
<P>Action 1</P>
Coloque o valor True na propriedade Default.
Compile e coloque o executável em um diretório com autorização de execução de cgis em um servidor web. Se você executar este programa pelo Lazarus, ele mostrará a mensagem:
Project <nome do projeto> raised Exception Class 'Exception' with message:
No REQUEST_METHOD passed from server.
Os fóruns de discussão da Internet não foram capazes de esclarecer os usuários do Lazarus de forma correta a respeito deste erro e nem do uso correto dos componentes fpweb. Foi preciso um enorme esforço para descobrir estas informações, sem documentação. Por isso estamos colocando esta ajuda para os "abandonados pelos técnicos".
Olá amigo, estou desenvolvendo uma aplicação utilizando lazarus+CGI, utilizo como servidor web o apache porém não estou conseguindo acessar o banco de dados pelo aplicativo CGI. Desculpe pois sou leigo com CGI mas é possível fazer a conexão utilizando os componentes nativos do lazarus certo? Configurando os componentes dentro do meu webmodule chego a conectar o banco em tempo de projeto porém em tempo de execução dá erro antes mesmo da minha aplicação retornar algo ao browser. Estou fazendo algo de errado?
ResponderExcluirDesde já agradeço pela atenção.
Abraço.
Ezequiel. Este exemplo falha para dar à pessoa a ideia de acesso ao Banco de Dados.
ExcluirO mais recomendado para o Apache em Linux (que fique bem claro) é o acesso através do módulo Mysql ou Postgres do PHP. Em segundo viria o acesso via ODBC do Linux, que é chato de mexer.
Em modo CGI, primeiro faça um programa on-line que use os TWebModule ou semelhantes das novas versões Lazarus (podem mudar de nome).
Depois que funcionar, tente fazer a chamada CGI.
Como o CGI é considerado vulnerável, você terá que mexer nas permissões em modo local, até que consiga acessar o banco local (faça esta experiência em sua porópria máquina).
No passo seguinte, acessando HTTP em outro servidor, e não mais em modo local, vai ser preciso monitorar o acesso com as ferramentas do Firewall, até desbloquear o que é necessário.
Qualquer coisa, pode enviar questionamentos.
Para apressar sua solução, veja o link:
Excluirhttps://www.vivaolinux.com.br/artigo/Pascal-para-Web-com-CGI-Parte-I
No artigo tem links para as outras partes. Não tenho problema em divulgar links de outros. O que eu nquero é que você resolva seu problema.
Olá Bernardo, obrigado pelo retorno.
ExcluirUtilizando o TWebModule confesso que não consegui seguir a diante, porém, contornei de outra forma. Criei um executável novo (novo->projeto->programa simples), por lá consegui configurar via odbc e acessar o banco normalmente e retornando as informações via writeln. Dessa forma já me atende.
Obrigado