A partir desta palestra, entraremos no processo de aprendizagem da programação CGI. Nas palestras anteriores, você dominou o conhecimento básico de programação CGI. Agora você pode sentar e escrever seu programa CGI!
3. Programação CGI
1. Anexo do lado do servidor (SSI) e gateway
2. Gateway: conecte outros protocolos através da WEB
No processo de escrever programas CGI, é melhor seguir os seguintes pontos de design do aplicativo:
(1) Faça uma pergunta – o problema que você deseja resolver
(2) Estágio de design - conceber a estrutura básica e as funções do programa CGI
(3) Estágio de codificação – concretizando ideias com ações
(4) Transplante de programa - escrever código portátil
(5) Buscar a excelência – levar o programa a um nível mais alto
1. Anexo do lado do servidor (SSI) e gateway
Nesta seção apresentaremos a conexão do lado do servidor SSI (Server Side Include) e gateway. Estritamente falando, o SSI não faz parte da programação CGI, mas o SSI pode realizar algumas tarefas que programas CGI simples podem realizar e, às vezes, o SSI é até a melhor escolha. Portanto, uma breve introdução é feita aqui.
SSI define um conjunto de comandos incorporados no texto HTML Antes do texto HTML ser enviado ao cliente HTTP, o servidor WEB pré-processa esses comandos SSI e envia o texto HTML processado para o navegador do cliente HTTP.
O formato do comando do SSI é:
< !--# parâmetro de comando = "valor" -->
Os comandos SSI são diferentes de java ou JavaScript porque são processados no lado do servidor e não no lado do cliente. Isso é semelhante aos programas CGI. É claro que, dentro do escopo funcional do SSI, suas vantagens são as mesmas dos programas CGI. Ele pode melhorar a utilização de recursos do servidor, e qualquer navegador WEB no cliente pode navegar por texto HTML contendo SSI.
A seguir estão seis comandos SSI comumente usados:
(1) Incluir comando
(2) comando de eco
(3) comando executivo
(4) comando de configuração
(5) comando fsize
(6) comando flashmod
incluir comando
O único parâmetro suportado é file, que insere o conteúdo do arquivo especificado pelo parâmetro file no texto HTML atual. Se você conhece a linguagem C, verá que ela tem a mesma função do comando "#include" na linguagem C. Por exemplo, existem dois textos HTML: main.html e header.html Use o comando include em main.html: main.html:
<html>
<tilte> Teste Incluir Comando SSI </ /title>
< !--#include file="header.html" -->
<corpo>
O cabeçalho acima vem de header.html!
</corpo>
</html>
cabeçalho.html:
<H1> Este é um título em header.html </H1>!
(No entanto, parece que OmniHTTPD não suporta o comando include, :< !)
comando de eco
O único parâmetro suportado é var, que é usado para exibir variáveis fornecidas pelo servidor, por exemplo:
DOCUMENT_NAME: nome do arquivo atual
DOCUMENT_URL: caminho relativo ao texto SSI
DATE_LOCAL: data local
DATE_GMT: data GMT (horário padrão de Creenwich)
LAST_MODIFIED: A data da última modificação do arquivo que contém este comando SSI
HTTP_USER_AGENT: nome do navegador.
Por exemplo: main.shtml <html>
Este documento foi atualizado pela última vez em < !--#echo var="LAST_MODIFIED"-->
</html>
Ao abrir main.shtml com um navegador, você pode ver a hora da última modificação. (Deve-se observar que main.shtml deve ser armazenado no diretório HtDocs do OmniHTTPD e acessado no navegador através do endereço http://localhost/main.shtml.)
comando executivo
Os dois parâmetros são cgi e cmd. O primeiro chama um arquivo executável, como cgi="/cgi-bin/finger.cgi"; o último chama um comando do sistema, como cmd="ls". Infelizmente, OmniHTTPD não suporta este comando SSI (talvez a versão mais recente suporte agora).
comando de configuração
Este comando define a forma como o servidor lida com arquivos e exibe datas. Possui dois parâmetros:
(1) timefmt, determina o formato de exibição de datas. Use man strftime no UNIX para consultar os valores disponíveis.
(2) sizefmt, determina o formato para exibir o comprimento do arquivo. O valor é bytes ou endereço. Este comando também não é compatível com OmniHTTPD.
comando fsize
Este comando exibe o tamanho de um determinado arquivo. O parâmetro é arquivo, especificando o caminho e o nome do arquivo.
comando flashmod
Este comando exibe a data da última modificação do arquivo especificado. O parâmetro é arquivo, especificando o caminho e o nome do arquivo.
2. Gateway: conecte outros protocolos através da WEB
O protocolo HTTP não pode acessar todos os recursos da Internet. Quando você deseja acessar outros recursos além do protocolo HTTP (como POP3 e SMTP para enviar e receber e-mails), você precisa de um gateway. Um programa CGI é uma boa maneira de implementar um gateway.
Alguns gateways comumente usados são fornecidos em muitos servidores HTTP UNIX, como finger, wais, archie, etc. Mas no OmniHTTPD esses gateways não são fornecidos. Mas podemos adicionar funcionalidade de gateway ao OmniHTTPD escrevendo programas CGI.
Formulários e seu processamento
Os formulários HTML fazem parte de documentos WEB e são utilizados para enviar ao servidor informações preenchidas pelos usuários. Normalmente, essas informações são passadas para o programa CGI, que realiza uma série de operações ou processamento de dados com base nas informações de entrada e, em seguida, gera um documento HTML representando os resultados do processamento e o envia de volta ao navegador do cliente.
Pode-se observar que a parte principal do programa CGI é obter dados de entrada e gerar documentos HTML, enquanto as partes de operação e processamento de dados são as mesmas da maioria dos aplicativos. Nesta palestra, apresentarei como obter dados e gerar documentos HTML em Perl e Delphi.
Primeiro, criamos um documento HTML chamado saudação.html:
Arquivo saudação.html (armazenado no diretório HtDocs do OmniHTTPD)
<html>
<cabeça>
<title>Esta é uma página de saudações </title>
<h1> Saudação </ /h1>
<corpo>
<h>
<form action="/cgi-bin/greeting.pl" método=POST>
< p> Seu nome: < input type=text name="firstname" size=60 maxlength=80> </p>
< p> Seu sobrenome: < input type=text name="lastname" size=60 maxlength=80> </p>
<h>
< p> < input type=submit value="Tudo OK!"> < input type=reset value="Limpar tudo"> </ /p>
</form>
</corpo>
</html>
Aqui está o programa Perl CGI saudação.pl:
Arquivo Greeting.pl (armazenado no diretório cgi-bin do OmniHTTPD) # Greeting You!
requer "cgi-lib.pl";
#===================================
#obtém valores de entrada
&ReadParse(*entrada);
$mPrimeiroNome = $input{'nome'};
$mSobrenome = $input{'sobrenome'};
#===================================
#faça algumas operações aqui
$mNomeCompleto = "$mPrimeiroNome $mSobrenome";
#===================================
# cria documento HTML para saída
Imprimir&PrintHeader;
print "< html>< head>< title> Saudações! </ /title>< /head> ";
print "<body> Olá, <i>$mFullName< /i> ! ";
imprimir "<hr> por Greeting.pl </body>< /html>";
#===================================
#Tudo pronto!
Teste o programa CGI navegando em http://localhost/greeting.html.
No programa Perl acima, como um programa CGI, você deve usar require "cgi-lib.pl" para fazer referência ao arquivo cgi-lib.pl. Este arquivo possui muitas funções e procedimentos para programação CGI. require é equivalente a #include em C, mas deve-se observar que deve haver um ponto e vírgula após a instrução require.
O processo ReadParse lê os dados enviados pelo formulário HTML e o parâmetro é um ponteiro de array. Deve-se notar que em Perl, chamadas de funções e procedimentos devem ser precedidas por um símbolo &.
mFirstName, mLastName e mFullName são variáveis. Em Perl, os nomes das variáveis devem ser precedidos por um sinal $.
O valor de retorno real da função PrintHeader é "Tipo de conteúdo: texto/html", que informa ao navegador que os dados a seguir são um documento HTML.
Gerar o documento HTML é muito simples, basta usar a instrução print para gerar o conteúdo do documento HTML. Que tal? Você pode usar Perl para escrever programas CGI?
A seguir, vamos escrever um programa Delphi para realizar a mesma função:
Primeiro feche todos os projetos no Delphi, selecione o menu Arquivo/Novo, selecione o tipo de aplicação Web Server na caixa de diálogo e use a opção CGI Stand-alone executável. Um novo projeto aparecerá com o nome da janela principal WebModule1.
Clique duas vezes com o mouse na propriedade Actions do WebModule1 e a janela de edição da propriedade Actions aparecerá. Crie uma nova Action na janela, chamada WebActionItem1, defina sua propriedade Default como True e clique duas vezes no evento OnAction em seus Events, adicione o seguinte código:
procedimento TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
mPrimeiroNome, mLlastName, mFullName: string;
HTMLDoc: string;
começar
//Obter valores de entrada:
mPrimeiroNome := Request.ContentFields.Values['nome'];
mLastName := Request.ContentFields.Values['sobrenome'];
//Faça algumas operações aqui
mNomeCompleto := mPrimeiroNome + ' ' + mLSobrenome;
// Cria documento HTML para saída
HtmlDoc := '< html>< head>< title> Saudações </ /title>< /head>';
HtmlDoc := HtmlDoc + '< corpo> Olá, < i>' + mFullName + '< /i> !';
HtmlDoc := HtmlDoc + '< hr> por Greeting.cgi </body>< /html>';
Response.Content := HtmlDoc;
fim;
Salve a unidade deste projeto como cgimain.pas e o projeto como saudação.dpr. Após compilar (usando Ctrl+F9), copie saudação.exe para o diretório cgi-bin do OmniHTTPD e renomeie-o para saudação.cgi. Ao mesmo tempo, modifique o Greeting.html que escrevemos anteriormente da seguinte forma:
Altere <form action="/cgi-bin/greeting.pl" method=POST> para
<form action="/cgi-bin/greeting.cgi" método=POST>
Desta forma, você pode testar programas CGI escritos em Delphi navegando em http://localhost/greeting.html.
Como pode ser visto neste programa, no Delphi, o evento OnAction de WebActionItem ocorre assim que o programa CGI recebe uma solicitação. Neste caso, a entrada de dados e a geração do documento HTML são feitas assim:
Obtenha o valor do elemento do formulário por meio de Request.ContentFields.Values[nome do elemento do formulário HTML].
Gere documentos HTML atribuindo um valor a Response.Content.
A seguir está o conteúdo dos três arquivos do programa Delphi: ------------------------------------ ---- -------------------
saudação.dpr:
saudação do programa;
{$APPTYPE CONSOLE}
usa
HTTPApp,
CGIApp,
cgimain em 'cgimain.pas' {WebModule1: TWebModule};
{$Ecgi}
{$R *.RES}
começar
Aplicativo.Inicializar;
Application.CreateForm(TWebModule1, WebModule1);
Aplicativo.Executar;
fim.
-------------------------------------------------- ----------
cgimain.pas:
unidade cgimain;
interface
usa Windows, Mensagens, SysUtils, Classes, HTTPApp;
tipo
TWebModule1 = classe(TWebModule)
procedimento WebModule1WebActionItem1Action(Sender: TObject;Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
privado
{Declarações privadas}
público
{Declarações públicas}
fim;
var
WebModule1: TWebModule1;
implementação
{$R *.DFM}
procedimento TWebModule1.WebModule1WebActionItem1Action(Remetente: TObject; Solicitação: TWebRequest; Resposta: TWebResponse; var Manipulado: Boolean);
var
mPrimeiroNome, mLlastName, mFullName: string;
HTMLDoc: string;
começar
//Obter valores de entrada:
mPrimeiroNome := Request.ContentFields.Values['nome'];
mLastName := Request.ContentFields.Values['sobrenome'];
//Faça algumas operações aqui
mNomeCompleto := mPrimeiroNome + ' ' + mLSobrenome;
// Cria documento HTML para saída
HtmlDoc := '< html>< head>< title> Saudações </ /title>< /head>';
HtmlDoc := HtmlDoc + '< corpo> Olá, < i>' + mFullName + '< /i> !';
HtmlDoc := HtmlDoc + '< hr> por Greeting.cgi </body>< /html>';
Response.Content := HtmlDoc;
fim;
fim.
-------------------------------------------------- ----------
cgimain.dfm:
objeto WebModule1: TWebModule1
OldCreateOrder = Falso
Ações = <
item
Padrão = Verdadeiro
Nome = 'WebActionItem1'
OnAction = WebModule1WebActionItem1Action
fim>
Esquerda = 192
Superior = 107
Altura = 150
Largura = 215
fim