Breve Introdução a CGI




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 web browsers (navegadores como o Internet Explorer ou o Netscape). Tecnicamente, os navegadores deveriam ser chamados de clientes web e, as pessoas que os utilizam, deveriam ser chamados 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, um gráfico ou qualquer outro tipo de arquivo.

Quando o servidor web recebe uma solicitação, realiza três tarefas na seguinte ordem:

  1. 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.
  2. Envia uma linha em branco.
  3. Envia o conteúdo do arquivo.



Como o Servidor Web envia arquivos

Um de cada vez. Por incrível que pareça, apenas UM.

Sabemos que uma página de web típica é constituída por um documento HTML e por alguns gráficos. 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 um arquivo. Ele simplesmente lê os dados do arquivo e os transmite para o cliente. Como resultado desse 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 dados que você estará enviando, você precisa suprir a saída padrão com esta informação.

Foi dito acima 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 etc.

É 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!
  • Os dados não 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, possivelmente, de alguma outra fonte).

Assim que os dados tenham sido recebidos (lidos pelo servidor), podem imediatamente serem 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”;

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s


%d blogueiros gostam disto: