Programação Web C++
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 web e um script personalizado.
-
As especificações CGI são atualmente mantidas pelo NCSA e o NCSA define o CGI como segue -
-
A Common Gateway Interface, ou CGI, é um padrão para programas de gateway externos para fazer 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 hiperlink para navegar em uma determinada página da web ou URL.
-
Seu navegador entra em contato com o servidor web HTTP e exige a URL, ou seja. nome do arquivo.
-
O Web Server analisará a URL e procurará o nome do arquivo. Se encontrar o arquivo solicitado, o servidor da Web enviará esse arquivo de volta ao navegador, 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 arquivo recebido ou a mensagem de erro com base na resposta recebida.
No entanto, é 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 a saída produzida do programa é enviada de volta ao seu navegador para exibição.
O Common Gateway Interface (CGI) é um protocolo padrão para permitir que aplicativos (chamados programas CGI ou scripts CGI) interajam com servidores Web e clientes. Esses programas CGI podem ser escritos em Python, PERL, Shell, C ou C++ etc.
Diagrama de arquitetura CGI
O programa simples a seguir mostra uma arquitetura simples de CGI -
Configuração do servidor Web
Antes de prosseguir com a Programação CGI, certifique-se de que seu Servidor Web suporte CGI e esteja configurado para lidar com Programas CGI. Todos os Programas CGI a serem executados pelo servidor HTTP são mantidos em um diretório pré-configurado. Esse diretório é chamado de diretório CGI e, por convenção, é nomeado como /var/www/cgi-bin. Por convenção, os arquivos CGI terão extensão como .cgi , embora sejam executáveis em C++.
Por padrão, o Apache Web Server é configurado para executar programas CGI em /var/www/cgi-bin. Se você deseja especificar qualquer outro diretório para executar seus scripts CGI, você pode modificar a seção a seguir no arquivo httpd.conf −
<Directory "/var/www/cgi-bin"> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> <Directory "/var/www/cgi-bin"> Options All </Directory>
Aqui, suponho que você tenha o Web Server instalado e funcionando com sucesso e seja capaz de executar qualquer outro programa CGI, como Perl ou Shell, etc.
Primeiro Programa CGI
Considere o seguinte conteúdo do programa C++ -
#include <iostream> using namespace std; int main () { cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>Hello World - First CGI Program</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<h2>Hello World! This is my first CGI program</h2>\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }
Compile o código acima e nomeie o executável como cplusplus.cgi. Este arquivo está sendo mantido no diretório /var/www/cgi-bin e possui o seguinte conteúdo. Antes de executar seu programa CGI, certifique-se de ter alterado o modo de arquivo usando chmod 755 cplusplus.cgi Comando UNIX para tornar o arquivo executável.
Meu primeiro programa CGI
O programa C++ acima é um programa simples que está escrevendo sua saída no arquivo STDOUT, ou seja, na tela. Há um recurso importante e extra disponível que é a impressão de primeira linha Content-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 Python. Um programa CGI C++ pode interagir com qualquer outro sistema externo, como RDBMS, para trocar informações.
Cabeçalho HTTP
A linha Content-type:text/html\r\n\r\n é uma parte do cabeçalho HTTP, que é enviado ao navegador para entender o conteúdo. Todo o cabeçalho HTTP estará no seguinte formato -
HTTP Field Name: Field Content For Example Content-type: text/html\r\n\r\n
Existem alguns outros cabeçalhos HTTP importantes, que você usará frequentemente em sua programação CGI.
Sr.Nº | Cabeçalho e descrição |
---|---|
1 | Tipo de conteúdo: Uma string MIME que define o formato do arquivo que está sendo retornado. O exemplo é Content-type:text/html. |
2 | Expira:Data A data em que a informação se torna inválida. 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 | Local:URL A URL que deve ser retornada em vez da URL solicitada. Você pode usar este arquivo para redirecionar uma solicitação para qualquer arquivo. |
4 | Última modificação:data A data da última modificação do recurso. |
5 | Tamanho do conteúdo:N 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º | Nome e descrição da variável |
---|---|
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 de consulta que estão disponíveis apenas para solicitações POST. |
3 | HTTP_COOKIE Retorna os cookies definidos na forma de par de chave e valor. |
4 | HTTP_USER_AGENT O campo de cabeçalho de solicitação do User-Agent contém informações sobre o agente do usuário que originou a solicitação. É um 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 log 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 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 de 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.
#include <iostream> #include <stdlib.h> using namespace std; const string ENV[ 24 ] = { "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE", "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING", "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION", "HTTP_HOST", "HTTP_USER_AGENT", "PATH", "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT", "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME", "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN", "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL", "SERVER_SIGNATURE","SERVER_SOFTWARE" }; int main () { cout << "Content-type:text/html\r\n\r\n"; cout << "<html>\n"; cout << "<head>\n"; cout << "<title>CGI Environment Variables</title>\n"; cout << "</head>\n"; cout << "<body>\n"; cout << "<table border = \"0\" cellspacing = \"2\">"; for ( int i = 0; i < 24; i++ ) { cout << "<tr><td>" << ENV[ i ] << "</td><td>"; // attempt to retrieve value of environment variable char *value = getenv( ENV[ i ].c_str() ); if ( value != 0 ) { cout << value; } else { cout << "Environment variable does not exist."; } cout << "</td></tr>\n"; } cout << "</table><\n"; cout << "</body>\n"; cout << "</html>\n"; return 0; }
Biblioteca CGI C++
Para exemplos reais, você precisaria fazer muitas operações pelo seu programa CGI. Existe uma biblioteca CGI escrita para o programa C++ que você pode baixar em ftp://ftp.gnu.org/gnu/cgicc/ e siga os passos para instalar a biblioteca −
$tar xzf cgicc-X.X.X.tar.gz $cd cgicc-X.X.X/ $./configure --prefix=/usr $make $make install
Você pode verificar a documentação relacionada disponível em ‘C++ CGI Lib Documentation.
Métodos GET e POST
Você já deve ter se deparado com muitas situações em que precisa passar algumas informações do seu navegador para o servidor web e, finalmente, para o seu Programa CGI. O navegador mais frequentemente usa dois métodos para passar essas informações para o servidor web. Esses métodos são o Método GET e o Método POST.
Passando informações usando o método GET
O método GET envia as informações codificadas do usuário anexadas à solicitação de página. A página e as informações codificadas são separadas por ? caractere da seguinte forma -
http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2
O método GET é o método padrão para passar informações do navegador para o servidor web e produz uma longa string que aparece na caixa Location:do seu navegador. Nunca use o método GET se você tiver senha ou outras informações confidenciais para passar para o servidor. O método GET tem limitação de tamanho e você pode passar até 1024 caracteres em uma string de solicitação.
Ao usar o método GET, as informações são passadas usando o cabeçalho HTTP QUERY_STRING e estarão acessíveis em seu programa CGI por meio da variável de ambiente QUERY_STRING.
Você pode passar informações simplesmente concatenando pares de chave e valor junto com qualquer URL ou você pode usar tags HTML
Linguagem C