Perl - Programação CGI
O que é CGI?
A Common Gateway Interface, ou CGI, é um conjunto de padrões que define como as informações são trocadas entre o servidor da web e um script personalizado.
As especificações CGI são atualmente mantidas pela NCSA e a NCSA define CGI como segue -
A Common Gateway Interface, ou CGI, é um padrão para programas de gateway externo fazerem interface com servidores de informações, como servidores HTTP.
A versão atual é CGI / 1.1 e CGI / 1.2 está em andamento.
Navegação na web
Para entender o conceito de CGI, vamos ver o que acontece quando clicamos em um hiper link disponível em uma página da web para navegar em uma determinada página ou URL.
Seu navegador entra em contato com o servidor da web usando o protocolo HTTP e exige a URL, ou seja, o nome do arquivo da página da web.
O servidor da Web verificará a URL e procurará o nome do arquivo solicitado. Se o servidor da web encontrar esse arquivo, ele o enviará de volta ao navegador sem qualquer outra execução, caso contrário, enviará uma mensagem de erro indicando que você solicitou um arquivo errado.
O navegador da Web recebe a resposta do servidor da Web e exibe o conteúdo do arquivo recebido ou uma mensagem de erro caso o arquivo não seja encontrado.
Porém, é possível configurar o servidor HTTP de forma que sempre que um arquivo em um determinado diretório for solicitado esse arquivo não seja devolvido; em vez disso, ele é executado como um programa, e tudo o que esse programa produz como resultado, é enviado de volta para o seu navegador exibir. Isso pode ser feito usando uma funcionalidade especial disponível no servidor web e é chamadaCommon Gateway Interfaceou CGI e tais programas que são executados pelo servidor para produzir o resultado final, são chamados de scripts CGI. Esses programas CGI podem ser PERL Script, Shell Script, programa C ou C ++, etc.
Diagrama de Arquitetura CGI
Suporte e configuração de servidor web
Antes de prosseguir com a Programação CGI, certifique-se de que seu servidor da Web suporta a funcionalidade CGI e está configurado para lidar com programas CGI. Todos os programas CGI a serem executados pelo servidor web são mantidos em um diretório pré-configurado. Esse diretório é denominado diretório CGI e, por convenção, é denominado / cgi-bin. Por convenção, os arquivos Perl CGI terão extensão como.cgi.
Primeiro Programa CGI
Aqui está um link simples que está vinculado a um script CGI chamado hello.cgi . Este arquivo foi mantido em/cgi-bin/diretório e tem o seguinte conteúdo. Antes de executar seu programa CGI, certifique-se de alterar o modo de arquivo usandochmod 755 hello.cgi Comando UNIX.
#!/usr/bin/perl
print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<title>Hello Word - First CGI Program</title>';
print '</head>';
print '<body>';
print '<h2>Hello Word! This is my first CGI program</h2>';
print '</body>';
print '</html>';
1;
Agora, se você clicar hello.cgi o link e a solicitação vai para o servidor da web que procura hello.cgi no diretório / cgi-bin, executa-o e qualquer resultado gerado, o servidor da web envia o resultado de volta para o navegador da web, que é o seguinte -
Hello Word! This is my first CGI program
Este script hello.cgi é um script Perl simples que grava sua saída no arquivo STDOUT, ou seja, na tela. Há um recurso importante e extra disponível, que é a primeira linha a ser impressaContent-type:text/html\r\n\r\n. Esta linha é enviada de volta ao navegador e especifica o tipo de conteúdo a ser exibido na tela do navegador. Agora você deve ter entendido o conceito básico de CGI e pode escrever muitos programas CGI complicados usando Perl. Este script pode interagir com qualquer outro sistema externo também para trocar informações como um banco de dados, serviços da web ou qualquer outra interface complexa.
Compreendendo o cabeçalho HTTP
A primeira linha Content-type:text/html\r\n\r\né uma parte do cabeçalho HTTP, que é enviado ao navegador para que ele possa entender o conteúdo de entrada do servidor. Todo o cabeçalho HTTP estará no seguinte formato -
HTTP Field Name: Field Content
Por exemplo -
Content-type:text/html\r\n\r\n
Existem alguns outros cabeçalhos HTTP importantes, que você usará com freqüência em sua programação CGI.
Sr. Não. | Cabeçalho e Descrição |
---|---|
1 | Content-type: String Uma string MIME que define o formato do conteúdo que está sendo retornado. O exemplo é Content-type: text / html |
2 | Expires: Date String A data em que as informações se tornam inválidas. Isso deve ser usado pelo navegador para decidir quando uma página precisa ser atualizada. Uma string de data válida deve estar no formato 01 de janeiro de 1998 12:00:00 GMT. |
3 | Location: URL String O URL que deve ser retornado em vez do URL solicitado. Você pode usar este campo para redirecionar uma solicitação para qualquer outro local. |
4 | Last-modified: String A data da última modificação do arquivo. |
5 | Content-length: String O comprimento, em bytes, dos dados que estão sendo retornados. O navegador usa esse valor para relatar o tempo estimado de download de um arquivo. |
6 | Set-Cookie: String Defina o cookie passado pela string |
Variáveis de ambiente CGI
Todo o programa CGI terá acesso às seguintes variáveis de ambiente. Essas variáveis desempenham um papel importante ao escrever qualquer programa CGI.
Sr. Não. | Nomes e descrição das variáveis |
---|---|
1 | CONTENT_TYPE O tipo de dados do conteúdo. Usado quando o cliente está enviando conteúdo anexado ao servidor. Por exemplo, upload de arquivo, etc. |
2 | CONTENT_LENGTH O comprimento das informações da consulta. Está disponível apenas para solicitações POST |
3 | HTTP_COOKIE Retorna os cookies definidos na forma de par chave e valor. |
4 | HTTP_USER_AGENT O campo de cabeçalho de solicitação do Agente do Usuário contém informações sobre o agente do usuário que originou a solicitação. É o nome do navegador da web. |
5 | PATH_INFO O caminho para o script CGI. |
6 | QUERY_STRING As informações codificadas por URL que são enviadas com a solicitação do método GET. |
7 | REMOTE_ADDR O endereço IP do host remoto que está fazendo a solicitação. Isso pode ser útil para registro ou para fins de autenticação. |
8 | REMOTE_HOST O nome completo do host que está fazendo a solicitação. Se esta informação não estiver disponível, REMOTE_ADDR pode ser usado para obter o endereço de IR. |
9 | REQUEST_METHOD O método usado para fazer a solicitação. Os métodos mais comuns são GET e POST. |
10 | SCRIPT_FILENAME O caminho completo para o script CGI. |
11 | SCRIPT_NAME O nome do script CGI. |
12 | SERVER_NAME O nome do host ou endereço IP do servidor. |
13 | SERVER_SOFTWARE O nome e a versão do software que o servidor está executando. |
Aqui está um pequeno programa CGI para listar todas as variáveis CGI suportadas pelo seu servidor web. Clique neste link para ver o resultado Get Environment
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<font size=+1>Environment</font>\n";
foreach (sort keys %ENV) {
print "<b>$_</b>: $ENV{$_}<br>\n";
}
1;
Abrir uma caixa de diálogo "Download de arquivo"?
Às vezes, é desejável que você dê a opção de o usuário clicar em um link e abrir uma caixa de diálogo "Download de arquivo" para o usuário, em vez de exibir o conteúdo real. Isso é muito fácil e será obtido através do cabeçalho HTTP.
Este cabeçalho HTTP será diferente do cabeçalho mencionado na seção anterior. Por exemplo, se você quiser fazer umFileName arquivo para download de um determinado link, sua sintaxe será a seguinte -
#!/usr/bin/perl
# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";
# Actual File Content will go hear.
open( FILE, "<FileName" );
while(read(FILE, $buffer, 100) ) {
print("$buffer");
}
Métodos GET e POST
Você deve ter se deparado com muitas situações em que precisa passar algumas informações de seu navegador para o servidor da web e, finalmente, para seu Programa CGI que trata de suas solicitações. Na maioria das vezes, o navegador usa dois métodos para passar essas informações ao servidor da web. Esses métodos sãoGET Método e POSTMétodo. Vamos verificá-los um por um.
Passando informações usando o método GET
O método GET envia as informações codificadas do usuário anexadas ao próprio URL da página. A página e as informações codificadas são separadas por? personagem como segue -
http://www.test.com/cgi-bin/hello.cgi?key1=value1&key2=value2
O método GET é o método padrão para passar informações de um navegador para o servidor web e produz uma longa string que aparece na caixa Location: do seu navegador. Você nunca deve usar o método GET se tiver uma senha ou outras informações confidenciais para passar ao servidor. O método GET tem limitação de tamanho: apenas 1024 caracteres podem ser passados em uma string de solicitação.
Esta informação é passada usando QUERY_STRING cabeçalho e estará acessível em seu programa CGI através da variável de ambiente QUERY_STRING que você pode analisar e usar em seu programa CGI.
Você pode passar informações simplesmente concatenando pares de chave e valor junto com qualquer URL ou pode usar tags HTML <FORM> para passar informações usando o método GET.
Exemplo de URL simples: Método Get
Aqui está uma URL simples que passará dois valores para o programa hello_get.cgi usando o método GET.
Abaixo está hello_get.cgi script para lidar com a entrada fornecida pelo navegador da web.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "GET") {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$first_name = $FORM{first_name};
$last_name = $FORM{last_name};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";
1;
Exemplo de FORM simples: Método GET
Aqui está um exemplo simples, que passa dois valores usando HTML FORM e o botão de envio. Vamos usar o mesmo script CGI hello_get.cgi para lidar com essa entrada.
<FORM action = "/cgi-bin/hello_get.cgi" method = "GET">
First Name: <input type = "text" name = "first_name"> <br>
Last Name: <input type = "text" name = "last_name">
<input type = "submit" value = "Submit">
</FORM>
Aqui está a saída real da codificação de formulário acima. Agora você pode inserir o nome e o sobrenome e clicar no botão enviar para ver o resultado.
Passando informações usando o método POST
Um método mais confiável de passar informações para um programa CGI é o POSTmétodo. Isso empacota as informações exatamente da mesma maneira que os métodos GET, mas em vez de enviá-las como uma string de texto após um?no URL, ele a envia como uma mensagem separada como parte do cabeçalho HTTP. O servidor da Web fornece essa mensagem ao script CGI na forma de entrada padrão.
Abaixo está o modificado hello_post.cgiscript para lidar com a entrada fornecida pelo navegador da web. Este script irá lidar com o método GET e também com o método POST.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$first_name = $FORM{first_name};
$last_name = $FORM{last_name};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";
1;
Tomemos novamente o mesmo exemplo acima, que passa dois valores usando HTML FORM e o botão submit. Vamos usar o script CGI hello_post.cgi para lidar com esta entrada.
<FORM action = "/cgi-bin/hello_post.cgi" method = "POST">
First Name: <input type = "text" name = "first_name"> <br>
Last Name: <input type = "text" name = "last_name">
<input type = "submit" value = "Submit">
</FORM>
Aqui está o resultado real da codificação do formulário acima. Você insere o nome e o sobrenome e, a seguir, clica no botão enviar para ver o resultado.
Passando os dados da caixa de seleção para o programa CGI
As caixas de seleção são usadas quando mais de uma opção deve ser selecionada. Aqui está um exemplo de código HTML para um formulário com duas caixas de seleção.
<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on"> Maths
<input type = "checkbox" name = "physics" value = "on"> Physics
<input type = "submit" value = "Select Subject">
</form>
O resultado deste código é o seguinte formato -
Abaixo está checkbox.cgi script para lidar com a entrada fornecida pelo navegador da web para o botão de rádio.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
if( $FORM{maths} ) {
$maths_flag ="ON";
} else {
$maths_flag ="OFF";
}
if( $FORM{physics} ) {
$physics_flag ="ON";
} else {
$physics_flag ="OFF";
}
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Checkbox - Third CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> CheckBox Maths is : $maths_flag</h2>";
print "<h2> CheckBox Physics is : $physics_flag</h2>";
print "</body>";
print "</html>";
1;
Passando Dados do Botão de Rádio para o Programa CGI
Os botões de rádio são usados quando apenas uma opção deve ser selecionada. Aqui está um exemplo de código HTML para um formulário com dois botões de opção -
<form action = "/cgi-bin/radiobutton.cgi" method = "POST" target = "_blank">
<input type = "radio" name = "subject" value = "maths"> Maths
<input type = "radio" name = "subject" value = "physics"> Physics
<input type = "submit" value = "Select Subject">
</form>
O resultado deste código é o seguinte formato -
Abaixo está radiobutton.cgi script para lidar com a entrada fornecida pelo navegador da web para o botão de rádio.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$subject = $FORM{subject};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Radio - Fourth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";
1;
Passando dados da área de texto para o programa CGI
Um elemento textarea é usado quando o texto de várias linhas deve ser passado para o programa CGI. Aqui está um exemplo de código HTML para um formulário com uma caixa TEXTAREA -
<form action = "/cgi-bin/textarea.cgi" method = "POST" target = "_blank">
<textarea name = "textcontent" cols = 40 rows = 4>
Type your text here...
</textarea>
<input type = "submit" value = "Submit">
</form>
O resultado deste código é o seguinte formato -
Abaixo está o textarea.cgi script para lidar com a entrada fornecida pelo navegador da web.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$text_content = $FORM{textcontent};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Entered Text Content is $text_content</h2>";
print "</body>";
print "</html>";
1;
Passando os dados da caixa suspensa para o programa CGI
Uma caixa suspensa é usada quando temos muitas opções disponíveis, mas apenas uma ou duas serão selecionadas. Aqui está um exemplo de código HTML para um formulário com uma caixa suspensa
<form action = "/cgi-bin/dropdown.cgi" method = "POST" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit">
</form>
O resultado deste código é o seguinte formato -
Abaixo está o dropdown.cgi script para lidar com a entrada fornecida pelo navegador da web.
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value;
}
$subject = $FORM{dropdown};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Dropdown Box - Sixth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";
1;
Usando Cookies em CGI
O protocolo HTTP é um protocolo sem estado. Mas para um site comercial, é necessário manter as informações da sessão entre as diferentes páginas. Por exemplo, o registro de um usuário termina após as transações que se estendem por muitas páginas. Mas como manter as informações da sessão do usuário em todas as páginas da web?
Em muitas situações, o uso de cookies é o método mais eficiente de lembrar e rastrear preferências, compras, comissões e outras informações necessárias para uma melhor experiência do visitante ou estatísticas do site.
Como funciona
Seu servidor envia alguns dados para o navegador do visitante na forma de um cookie. O navegador pode aceitar o cookie. Em caso afirmativo, ele é armazenado como um registro de texto simples no disco rígido do visitante. Agora, quando o visitante chega a outra página do seu site, o cookie fica disponível para recuperação. Uma vez recuperado, seu servidor sabe / lembra o que foi armazenado.
Cookies são um registro de dados de texto simples de 5 campos de comprimento variável -
Expires- A data em que o cookie irá expirar. Se estiver em branco, o cookie irá expirar quando o visitante sair do navegador.
Domain - O nome de domínio do seu site.
Path- O caminho para o diretório ou página da web que definiu o cookie. Isso pode ficar em branco se você quiser recuperar o cookie de qualquer diretório ou página.
Secure- Se este campo contiver a palavra "seguro", o cookie só poderá ser recuperado com um servidor seguro. Se este campo estiver em branco, não existe tal restrição.
Name = Value - Os cookies são definidos e visualizados novamente na forma de pares de chave e valor.
Configurando Cookies
É muito fácil enviar cookies para o navegador. Esses cookies serão enviados junto com o cabeçalho HTTP. Supondo que você deseja definir a ID do usuário e a senha como cookies. Então, será feito da seguinte maneira -
#!/usr/bin/perl
print "Set-Cookie:UserID = XYZ;\n";
print "Set-Cookie:Password = XYZ123;\n";
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT";\n";
print "Set-Cookie:Domain = www.tutorialspoint.com;\n";
print "Set-Cookie:Path = /perl;\n";
print "Content-type:text/html\r\n\r\n";
...........Rest of the HTML Content goes here....
Aqui usamos Set-CookieCabeçalho HTTP para definir cookies. É opcional definir atributos de cookies como Expires, Domain e Path. É importante notar que os cookies são definidos antes de enviar a linha mágica"Content-type:text/html\r\n\r\n.
Recuperando Cookies
É muito fácil recuperar todos os cookies configurados. Os cookies são armazenados na variável de ambiente CGI HTTP_COOKIE e terão a seguinte forma.
key1 = value1;key2 = value2;key3 = value3....
Aqui está um exemplo de como recuperar cookies.
#!/usr/bin/perl
$rcvd_cookies = $ENV{'HTTP_COOKIE'};
@cookies = split /;/, $rcvd_cookies;
foreach $cookie ( @cookies ) {
($key, $val) = split(/=/, $cookie); # splits on the first =.
$key =~ s/^\s+//;
$val =~ s/^\s+//;
$key =~ s/\s+$//;
$val =~ s/\s+$//;
if( $key eq "UserID" ) {
$user_id = $val;
} elsif($key eq "Password") {
$password = $val;
}
}
print "User ID = $user_id\n";
print "Password = $password\n";
Isso produzirá o seguinte resultado, desde que os cookies acima tenham sido configurados antes de chamar o script de cookies de recuperação.
User ID = XYZ
Password = XYZ123
Módulos e bibliotecas CGI
Você encontrará muitos módulos integrados na Internet que fornecem funções diretas para usar em seu programa CGI. A seguir estão os importantes uma vez.