Informática Numaboa - Tutoriais e Programação
Tutorial CGI - Introdução
Seg 17 Nov 2008 19:20 |
- Detalhes
- Categoria: Perl e CGI
- Atualização: Segunda, 17 Novembro 2008 20:29
- Autor: vovó Vicki
- Acessos: 8019
Meus mais sinceros agradecimentos a Stefan Münz, principal fonte de referência para este tutorial e autor de todos os exemplos nele contidos. Seu livro sobre HTML, escrito em alemão, é um dos melhores (senão o melhor) que já encontrei e está à disposição na web gratuitamente com uma boa parte já traduzida para o inglês.
O que é CGI
O termo CGI vem de Common Gateway Interface. É apenas uma outra designação para o que conhecemos como API (Application Programming Interface). Resumo da história, a CGI é apenas uma API para o servidor web.
O servidor web, por sua vez, é o software que envia páginas web para os browsers (navegadores como o Internet Explorer, Firefox ou Netscape). Tecnicamente, os navegadores deveriam ser chamados de clientes web e, as pessoas que os utilizam, deveriam ser chamadas de navegadores. Mas deixa pra lá...
Encontra-se muita informação a respeito da CGI na Internet porém, na maioria das vezes, desencontrada e cheia de mitos e preconceitos. Vamos esclarecer algumas dúvidas relatando o que não é a CGI...
A CGI não é...
... não é uma linguagem de programação: isto significa que você pode usar qualquer linguagem da sua escolha para escrever um programa CGI. É claro que a linguagem escolhida precisa ser capaz de ler um "input" e escrever um "output". Você conhece alguma linguagem de programação que não ofereça tais possibilidades?
...não necessita da linguagem PERL. A PERL pode ser usada assim como qualquer outra linguagem, como PHP, C, Phyton, Object Pascal, etc.
... não é apenas para especialistas em sistemas UNIX. Aliás, não há necessidade de ser especialista algum, noções básicas de programação são mais do que suficientes.
... não é um estilo de programação. Use seu estilo próprio, pois apenas com "input" e "output" podemos fazer com que o servidor web "converse" com a CGI.
O que faz um servidor web
Parece brincadeira, mas um servidor web apenas espera - a não ser que o site esteja sendo maciçamente acessado.
O que o servidor web fica esperando nada mais é do que um cliente, um navegador que solicite um arquivo. Este arquivo pode ser uma página HTML, uma imagem ou qualquer outro tipo de arquivo.
Quando o servidor web recebe uma solicitação, realiza três tarefas na seguinte ordem:
- Envia uma linha de texto raso que contém a indicação do tipo de arquivo que será enviado, ou seja, HTML, GIF, JPEG ou qualquer outro.
- Envia uma linha em branco.
- Envia o conteúdo do arquivo.
Como o servidor web envia arquivos
Um de cada vez. Por incrível que pareça, apenas UM de cada vez.
Sabemos que uma página de web típica é constituída por um documento HTML e por algumas imagens. Cada um deles é um arquivo diferente que precisa ser enviado ao navegador.
Como o servidor web envia apenas UM arquivo por vez, o navegador precisa iniciar uma nova sessão (solicitação) para cada um dos arquivos de que necessite. Ainda bem que, tanto o servidor web quanto o navegador, são multi-tarefa. O navegador pode solicitar vários arquivos simultaneamente e o servidor web pode enviar vários arquivos simultaneamente, porém, para cada um dos arquivos solicitados-enviados é necessária UMA SESSÃO própria.
O servidor web só é capaz de enviar arquivos?
Não necessariamente. Na verdade, o que ocorre é apenas uma transferência de dados. Lembre-se de que o servidor e o cliente (o navegador) geralmente são executados em computadores diferentes. Eles podem até usar sistemas operacionais diferentes em máquinas com microprocessadores diferentes. O navegador apenas solicita um "recurso" e não sabe, nem precisa saber, de onde o servidor obtém os dados.
Entretanto, um servidor típico está programado para obter seus dados de arquivos. Ele simplesmente lê os dados do arquivo e os transmite para o cliente. Como resultado deste processo, o servidor envia apenas dados estáticos, ou seja, o servidor não altera dinamicamente os dados enviados.
O que fazer para enviar dados dinâmicos?
Não é nada difícil. A CGI foi projetada justamente para cumprir esta função. Você simplesmente escreve um programa que produz dados dinamicamente e estes dados, ao invés de um arquivo, são enviados para o navegador.
Esta é a maneira como um programa CGI amplia a funcionalidade de um servidor, da mesma forma que, por exemplo, uma DLL amplia a funcionalidade do Windows. Mas tem uma grande diferença: a CGI é muitíssimo mais simples de escrever do que qualquer coisa para o Windows.
Mas, como falar com o navegador?
Não há necessidade de se falar com o navegador. É o servidor que faz este trabalho. O melhor da brincadeira é que você nem mesmo precisa falar com o servidor. Tudo o que você tem a fazer é escrever para uma saída padrão (standart output). Da mesma forma como, por exemplo, você usa o printf() da linguagem C.
A única coisa que não se pode perder de vista é a sequência das três tarefas realizadas pelo servidor numa transmissão de dados (citada acima). Uma vez que o servidor desconhece o tipo de dado que você estará enviando, você precisa suprir a saída padrão com esta informação.
Também foi dito que você pode usar seu estilo próprio. Pois vamos lá: suponha que seu servidor esteja rodando sob DOS. A bem da verdade, não existe nenhum servidor assim mas... existem servidores Windows e o Windows pode interpretar comandos do MS DOS. Sendo assim, imagine que você queira enviar uma lista do seu diretório corrente para a web (não é uma boa idéia, mas mostra como essa tarefa é simples). O MS DOS também tem o comando dir que envia a listagem de diretórios para a saída padrão. Então, teoricamente, poderíamos produzir o seguinte script:
1a. Tarefa: identificar o tipo de dados que serão enviados echo Content-type: text/plain 2a. Tarefa: enviar uma linha em branco echo 3a. Tarefa: enviar o conteúdo dir
O exemplo acima é apenas uma simulação de como funciona um script CGI usando elementos que a maioria das pessoas conhece. Foi citado apenas para entender o princípio de um output (saída) e não para funcionar de verdade. Agora, mais um passo...
Como conseguir um input (uma entrada)?
Primeiramente precisa ficar bem claro que a web NÃO é interativa. Isto significa que seu programa CGI não pode solicitar entradas (input) dos usuários, processá-las, enviar algum resultado (output), pedir mais um input, processá-lo e assim por diante.
É justamente por isso que a programação de uma CGI é muito simples. O programa recebe entradas do usuário apenas uma vez, logo no início, e envia apenas uma resposta (output). Entretanto, tanto a entrada quanto a resposta podem ter qualquer tamanho e complexidade, dependendo do que seu programa possa comportar.
Dito isto, você precisa saber que seu programa pode receber uma entrada do usuário de duas maneiras, dependendo do método que o navegador usar para enviá-lo ao servidor.
Onde o navegador acha o input do usuário?
O navegador aceita entradas usando formulários HTML (forms). Um formulário pode instruir o navegador para enviar dados através de dois métodos: GET e POST.
O método GET envia as entradas como parte da URL. O método POST envia as entradas como stdin. O segundo método parece ter algumas vantagens:
- É possível enviar maior quantidade de dados (a URL tem limite de tamanho).
- Os dados não são registrados em arquivos de acesso (log). Por exemplo: enviando uma senha como parte de uma URL deixa um rastro nos vários sistemas pelos quais os dados estejam passando e nos quais a URL esteja sendo logada!
- Os dados aparecem no campo de endereços do navegador. Novamente, mostrar uma senha no navegador pode não ser do agrado do usuário.
Como saber qual método está sendo usado?
O servidor web, antes de carregar seu programa CGI, inicializa algumas variáveis de contexto. Você pode analisar estas variáveis para saber a quantidade e a origem dos dados de entrada (input).
Uma das variáveis de contexto é a REQUEST_METHOD. Seu valor pode ser POST, GET e, eventualmente, HEAD.
Se REQUEST_METHOD indicar POST, a variável CONTENT_LENGTH indicará quantos bytes de dados deverão ser lidos através de stdin e a variável CONTENT_TYPE indicará que os dados se originam de um formulário (ou de outra fonte qualquer).
Assim que os dados tenham sido recebidos (lidos pelo servidor), podem ser imediatamente processados e a resposta (output) pode ser enviada através de um stdout. Geralmente a resposta é escrita na forma de dados HTML, com toda a formatação necessária. Mas programas CGI podem produzir qualquer tipo de resposta, como um arquivo GIF ou qualquer outra coisa.
Este é o motivo pelo qual você precisa indicar ao navegador, nas 2 primeiras etapas da transmissão, o tipo de dado que será enviado. Podemos identificar dados de HTML enviando a string Content-type: text/html (tarefa 1) seguida de uma string vazia (tarefa 2). Usando a linguagem C seria printf("Content-type: text/html\n\n"); onde \n é quebra de linha e o segundo \n outra quebra de linha para indicar a linha vazia. Usando PERL seria print "Content-type: text/html\n\n";