Programación web en C++
¿Qué es CGI?
-
Common Gateway Interface, o CGI, es un conjunto de estándares que definen cómo se intercambia la información entre el servidor web y un script personalizado.
-
Las especificaciones CGI son mantenidas actualmente por la NCSA y NCSA define CGI como sigue:
-
La interfaz de puerta de enlace común, o CGI, es un estándar para que los programas de puerta de enlace externa interactúen con servidores de información como los servidores HTTP.
-
La versión actual es CGI/1.1 y CGI/1.2 está en progreso.
Navegación web
Para comprender el concepto de CGI, veamos qué sucede cuando hacemos clic en un hipervínculo para navegar por una página web o URL en particular.
-
Su navegador se comunica con el servidor web HTTP y solicita la URL, es decir. nombre de archivo.
-
Web Server analizará la URL y buscará el nombre del archivo. Si encuentra el archivo solicitado, el servidor web envía ese archivo de vuelta al navegador; de lo contrario, envía un mensaje de error que indica que ha solicitado un archivo incorrecto.
-
El navegador web recibe la respuesta del servidor web y muestra el archivo recibido o el mensaje de error según la respuesta recibida.
Sin embargo, es posible configurar el servidor HTTP de tal manera que cada vez que se solicite un archivo en un directorio determinado, ese archivo no se devuelva; en su lugar, se ejecuta como un programa y la salida producida por el programa se envía de vuelta a su navegador para que se muestre.
Common Gateway Interface (CGI) es un protocolo estándar para permitir que las aplicaciones (llamadas programas CGI o scripts CGI) interactúen con servidores web y con clientes. Estos programas CGI pueden estar escritos en Python, PERL, Shell, C o C++, etc.
Diagrama de arquitectura CGI
El siguiente programa simple muestra una arquitectura simple de CGI −
Configuración del servidor web
Antes de continuar con la programación CGI, asegúrese de que su servidor web sea compatible con CGI y esté configurado para manejar programas CGI. Todos los programas CGI que ejecutará el servidor HTTP se guardan en un directorio preconfigurado. Este directorio se denomina directorio CGI y, por convención, se denomina /var/www/cgi-bin. Por convención, los archivos CGI tendrán la extensión .cgi , aunque son ejecutables en C++.
De forma predeterminada, el servidor web Apache está configurado para ejecutar programas CGI en /var/www/cgi-bin. Si desea especificar cualquier otro directorio para ejecutar sus scripts CGI, puede modificar la siguiente sección en el archivo 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>
Aquí, asumo que tiene el servidor web funcionando correctamente y puede ejecutar cualquier otro programa CGI como Perl o Shell, etc.
Primer programa CGI
Considere el siguiente contenido del 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 el código anterior y nombre el ejecutable como cplusplus.cgi. Este archivo se mantiene en el directorio /var/www/cgi-bin y tiene el siguiente contenido. Antes de ejecutar su programa CGI, asegúrese de tener el modo de cambio de archivo usando chmod 755 cplusplus.cgi Comando UNIX para hacer que el archivo sea ejecutable.
Mi primer programa CGI
El programa C ++ anterior es un programa simple que está escribiendo su salida en el archivo STDOUT, es decir, la pantalla. Hay una función importante y adicional disponible que es la impresión de primera línea Content-type:text/html\r\n\r\n . Esta línea se envía de vuelta al navegador y especifica el tipo de contenido que se mostrará en la pantalla del navegador. Ahora debe haber entendido el concepto básico de CGI y puede escribir muchos programas CGI complicados usando Python. Un programa CGI C++ puede interactuar con cualquier otro sistema externo, como RDBMS, para intercambiar información.
Encabezado HTTP
La línea Content-type:text/html\r\n\r\n es una parte del encabezado HTTP, que se envía al navegador para comprender el contenido. Todo el encabezado HTTP tendrá la siguiente forma −
HTTP Field Name: Field Content For Example Content-type: text/html\r\n\r\n
Hay algunos otros encabezados HTTP importantes, que usará con frecuencia en su Programación CGI.
Sr.No | Encabezado y descripción |
---|---|
1 | Tipo de contenido: Una cadena MIME que define el formato del archivo que se devuelve. El ejemplo es tipo de contenido:texto/html. |
2 | Caduca:Fecha La fecha en que la información deja de ser válida. Esto debe ser utilizado por el navegador para decidir cuándo debe actualizarse una página. Una cadena de fecha válida debe tener el formato 01 de enero de 1998 12:00:00 GMT. |
3 | Ubicación:URL La URL que debe devolverse en lugar de la URL solicitada. Puede usar este archivo para redirigir una solicitud a cualquier archivo. |
4 | Última modificación:Fecha La fecha de la última modificación del recurso. |
5 | Longitud del contenido:N La longitud, en bytes, de los datos que se devuelven. El navegador usa este valor para informar el tiempo estimado de descarga de un archivo. |
6 | Configurar-Cookie:Cadena Establecer la cookie pasada a través de la cadena . |
Variables de entorno CGI
Todo el programa CGI tendrá acceso a las siguientes variables de entorno. Estas variables juegan un papel importante al escribir cualquier programa CGI.
Sr.No | Nombre y descripción de la variable |
---|---|
1 | CONTENT_TYPE El tipo de datos del contenido, que se utiliza cuando el cliente envía contenido adjunto al servidor. Por ejemplo, carga de archivos, etc. |
2 | CONTENT_LENGTH La longitud de la información de consulta que está disponible solo para solicitudes POST. |
3 | HTTP_COOKIE Devuelve las cookies establecidas en forma de par clave y valor. |
4 | HTTP_USER_AGENT El campo de encabezado de solicitud de agente de usuario contiene información sobre el agente de usuario que origina la solicitud. Es un nombre del navegador web. |
5 | RUTA_INFO La ruta para el script CGI. |
6 | QUERY_STRING La información codificada en URL que se envía con la solicitud del método GET. |
7 | DIRECCIÓN_REMOTA La dirección IP del host remoto que realiza la solicitud. Esto puede ser útil para iniciar sesión o con fines de autenticación. |
8 | HOST_REMOTO El nombre completo del host que realiza la solicitud. Si esta información no está disponible, se puede usar REMOTE_ADDR para obtener la dirección IR. |
9 | REQUEST_METHOD El método utilizado para realizar la solicitud. Los métodos más comunes son GET y POST. |
10 | SCRIPT_NOMBRE DE ARCHIVO La ruta completa al script CGI. |
11 | SCRIPT_NOMBRE El nombre del script CGI. |
12 | NOMBRE_SERVIDOR El nombre de host o la dirección IP del servidor. |
13 | SOFTWARE_SERVIDOR El nombre y la versión del software que está ejecutando el servidor. |
Aquí hay un pequeño programa CGI para enumerar todas las variables 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 de C++
Para ejemplos reales, necesitaría hacer muchas operaciones con su programa CGI. Hay una biblioteca CGI escrita para el programa C++ que puede descargar desde ftp://ftp.gnu.org/gnu/cgicc/ y siga los pasos para instalar la biblioteca −
$tar xzf cgicc-X.X.X.tar.gz $cd cgicc-X.X.X/ $./configure --prefix=/usr $make $make install
Puede consultar la documentación relacionada disponible en 'C++ CGI Lib Documentation.
Métodos GET y POST
Debe haberse encontrado con muchas situaciones en las que necesita pasar información de su navegador al servidor web y, en última instancia, a su programa CGI. Con mayor frecuencia, el navegador utiliza dos métodos para pasar esta información al servidor web. Estos métodos son el método GET y el método POST.
Pasar información usando el método GET
El método GET envía la información de usuario codificada adjunta a la solicitud de página. La página y la información codificada están separadas por el ? carácter de la siguiente manera −
http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2
El método GET es el método predeterminado para pasar información del navegador al servidor web y produce una cadena larga que aparece en el cuadro Ubicación:de su navegador. Nunca use el método GET si tiene una contraseña u otra información confidencial para pasar al servidor. El método GET tiene una limitación de tamaño y puede pasar hasta 1024 caracteres en una cadena de solicitud.
Cuando se usa el método GET, la información se pasa usando el encabezado http QUERY_STRING y será accesible en su programa CGI a través de la variable de entorno QUERY_STRING.
Puede pasar información simplemente concatenando pares de clave y valor junto con cualquier URL o puede usar etiquetas HTML
Lenguaje C