Formulários: enviando dados

Nós já vimos que a criação de um script CGI é muito simples. O servidor web executa qualquer arquivo executável que estiver dentro do diretório cgi-bin. Todas as informações geradas pelo arquivo executável são enviadas para o navegador que solicitou o script. O que precisamos fazer agora é enviar as informações para o script. A maneira mais comum de enviar as informações é através de um formulário HTML.

Os formulários estão presentes em várias páginas da internet. Qualquer página em que você possa digitar alguma coisa é um formulário. Você pode ver formulários em ferramentas de busca, livros de visitas, questionários, etc. A página inicial do HowStuffWorks contém pelo menos dois mini-formulários. Um deles para a pergunta "Como você chegou aqui?" e outro com um espaço para escrever sugestões. Você pode criar o seu formulário na página HTML e no código HTML é possível especificar o nome do script CGI que vai ser executado quando o usuário clicar no botão Enviar. Os valores que o usuário digita no formulário são armazenados e enviados para o script, que utiliza essas informações da maneira que você quiser.

Você provavelmente já viu isso muitas vezes, mas não sabia como elas funcionavam. Por exemplo, vá para http://www.lycos.com (em inglês) e digite a palavra "test" no campo "Search for:". Agora pressione o botão "Go Get It!". A página resultante vai se parecer com essa:

  http://www.lycos.com/cgi-bin/pursuit?matchmode=and
                      cat=lycosandquery=testandx=10andy=9

Como você pôde perceber, a página inicial do Lycos é um formulário. Lycos tem um script no diretório cgi-bin que se chama pursuit. O formulário envia cinco parâmetros para o script:

  1. matchmode=and
  2. cat=lycos
  3. query=test
  4. x=10
  5. y=9
O terceiro parâmetro é o texto de busca que digitamos. Os outros quatro também significam algo para o script. O script CGI faz uma varredura no banco de dados da Lycos, procura pela palavra "test" e depois exibe um resultado. Essa é a base de qualquer ferramenta de busca.

Vamos criar um formulário simples para tentar fazer isso. Crie um arquivo com o nome simpleform.htm e insira o seguinte código HTML dentro dele:

  <html>
  <body>
    <h1>Um formulário super simples<h1>
    <FORM METHOD=GET ACTION="http://www.hsw.com.br/
  cgi-bin/simpleform.cgi">
    Digite o seu nome:
    <input name="Name" size=20 maxlength=50>
    <p>
    <INPUT TYPE=submit value="Submit">
    <INPUT TYPE=reset value="Reset">
    </FORM>
  </body>
  </html>

Você pode clicar neste endereço para testar o formulário:
http://www.hsw.com.br/simpleform.htm

Como você pôde perceber, o código HTML especifica a criação de um formulário que usa o método GET para enviar informações ao script CGI localizado em http://www.hsw.com.br/cgi-bin/simpleform.cgi. Dentro do formulário existe uma área de entrada de texto e os botões padrão Enviar e Limpar.

O arquivo http://www.hsw.com.br/cgi-bin/simpleform.cgi relacionado ao formulário é um programa em C. Ele foi gerado a partir desta linha de código C, escrita no arquivo chamado simpleform.c.

  #include <stdio.h>
  #include <stdlib.h>
    
  int main()
  {
    printf("Content-type: text/html\n");
    printf("<html>\n");    printf("<body>\n");
    printf("<h1>O valor digitado foi: ");
    printf("%s</h1>\n", getenv("QUERY_STRING"));
    printf("</body>\n");
    printf("</html>\n");
    return 0;
  } 

E foi compilado com o seguinte comando:

      gcc simpleform.c -o simpleform.cgi  

Ele está localizado no diretório cgi-bin. Este programa simplesmente coleta o valor enviado pelo formulário e o exibe. Por exemplo, você deverá ver o seguinte:

      O valor digitado foi: Name=João+Silva

Name é o identificador para a área de entrada de texto do formulário (cada área de entrada de texto deve ter um identificador único) e João+Silva é o nome que foi digitado no formulário. Note que o "+" substitui o espaço em branco.

A partir deste exemplo, você pode perceber que o processo básico para configurar um formulário e enviar dados de um formulário para um script CGI é bastante simples. Aqui estão alguns detalhes que devem ser levados em consideração:

  • Cada área de entrada de texto deve ter um identificador único;
  • O formulário deve usar os métodos GET ou POST. O método GET oferece uma vantagem: você pode ver os valores do formulário na página enviada para o script e isso facilita a resolução de possíveis problemas de código;
  • O método GET tem um limite de caracteres que podem ser enviados. Se o formulário for grande, prefira o método POST;
  • Dados que chegam através do método GET são recebidos pela variável QUERY_STRING (geralmente lida com a função getenv em C ou a função $ENV em PERL). Dados que chegam através do método POST estão disponíveis por STDIN utilizando gets em C ou read em PERL;
  • Os dados recebidos terão todos os campos concatenados em uma única linha. Muitos caracteres são substituídos e por isso precisam de tradução. Por exemplo, todos os espaços em branco serão substituídos por sinais "+".

Normalmente, a variável de ambiente QUERY_STRING levanta a questão das variáveis de ambiente em geral. Existem inúmeras variáveis de ambiente nos scripts CGI, incluindo:

  • AUTH_TYPE
  • CONTENT_LENGTH
  • CONTENT_TYPE
  • GATEWAY_INTERFACE
  • HTTP_ACCEPT
  • HTTP_USER_AGENT
  • PATH_INFO
  • PATH_TRANSLATED
  • QUERY_STRING
  • REMOTE_ADDR
  • REMOTE_HOST
  • REMOTE_IDENT
  • REMOTE_USER
  • REQUEST_METHOD
  • SCRIPT_NAME
  • SERVER_NAME
  • SERVER_PORT
  • SERVER_PROTOCOL
  • SERVER_SOFTWARE

Existe uma grande quantidade de informações relacionada a estas variáveis. Por exemplo, o tamanho do texto de entrada (CONTENT_LENGTH), o método de envio utilizado (GET ou POST: a variável REQUEST_METHOD informa se você acessar o STDIN ou QUERY_STRING para saber o que foi digitado), o <a href="http://www.hsw.com.br/questao549.htm">endereço IP</a> da máquina do usuário (REMOTE_ADDR) e muitas outras opções. Para uma descrição completa dessas variáveis, consulte Variáveis de ambiente CGI (em inglês).