C++ Programación web
¿Qué es CGI?
- La Interfaz de Puerta de Enlace Común (CGI, por sus siglas en inglés) es un conjunto de estándares que define cómo se intercambia la información entre el servidor web y los scripts del cliente.
- La especificación CGI actualmente es mantenida por NCSA, y NCSA define CGI de la siguiente manera:
- La Interfaz de Puerta de Enlace Común (CGI) es un estándar de interfaz utilizado para conectar programas de puerta de enlace externos con servidores de información (como servidores HTTP).
- La versión actual es CGI/1.1, y la versión CGI/1.2 está en desarrollo.
Navegación web
Para comprender mejor el concepto de CGI, hagamos clic en un hipervínculo, naveguemos a una página web o URL específica y veamos qué sucede.
- Su navegador se conecta al servidor web HTTP y solicita la URL, es decir, el nombre del archivo.
- El servidor web analizará la URL y buscará el nombre del archivo. Si encuentra el archivo solicitado, el servidor web enviará el archivo de vuelta al navegador; de lo contrario, enviará un mensaje de error indicando que ha solicitado un archivo incorrecto.
- El navegador web obtiene la respuesta del servidor web y muestra el archivo o el mensaje de error según la respuesta recibida.
Sin embargo, en un servidor HTTP configurado de esta manera, cada vez que se solicita un archivo en el directorio, el servidor HTTP no envía el archivo, sino que lo ejecuta como programa y envía la salida generada por la ejecución de vuelta al navegador para que se muestre.
La Interfaz de Puerta de Enlace Común (CGI) es un protocolo estándar que permite que las aplicaciones (llamadas programas CGI o scripts CGI) puedan interactuar con el servidor web y con el cliente. Estos programas CGI pueden escribirse en Python, PERL, Shell, C o C++, entre otros.
Diagrama de arquitectura CGI
El siguiente diagrama muestra la arquitectura de CGI:
Configuración del servidor web
Antes de realizar 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 ejecutados por el servidor HTTP deben estar en un directorio preconfigurado. Este directorio se llama directorio CGI y, por convención, se denomina /var/www/cgi-bin. Aunque los archivos CGI son ejecutables de C++, por convención su extensión es.cgi。
De forma predeterminada, el servidor web Apache está configurado para ejecutar programas CGI en /var/www/cgi-bin. Si desea especificar otro directorio para ejecutar 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í asumimos que el servidor web ya está configurado y funciona correctamente; puede ejecutar cualquier programa CGI, como Perl o Shell, etc.
Primer programa CGI
Observe el siguiente programa en C++:
Ejemplo
Compile el código anterior, nombre el archivo ejecutable cplusplus.cgi y guárdelo en el directorio /var/www/cgi-bin. Antes de ejecutar el programa CGI, utilicechmod 755 cplusplus.cgicomandos UNIX para modificar los permisos del archivo y asegurarse de que sea ejecutable. Al acceder al archivo ejecutable, verá la siguiente salida:
Hello World! Este es mi primer programa CGI
El programa C++ anterior es un programa simple que escribe su salida en el archivo STDOUT, es decir, la muestra en pantalla. Aquí, cabe destacar que la primera línea de salidaContent-type:text/html\r\n\r\nEsta línea se envía de vuelta al navegador y especifica el tipo de contenido que se mostrará en la ventana del navegador. Debe comprender los conceptos básicos de CGI para poder usar Python y escribir programas CGI más complejos. Los programas CGI en C++ pueden interactuar con cualquier otro sistema externo (como RDBMS).
Cabeceras HTTP
LíneaContent-type:text/html\r\n\r\nEs parte de las cabeceras HTTP y se envía al navegador para que comprenda mejor el contenido de la página. El formato de las cabeceras HTTP es el siguiente:
HTTP 字段名称: 字段内容 例如 Content-type: text/html\r\n\r\n
También hay otras cabeceras HTTP importantes que se utilizan con frecuencia en su programación CGI.
| Cabecera | Descripción |
|---|---|
| Content-type: | Cadena MIME que define el formato del archivo devuelto. Por ejemplo, Content-type:text/html. |
| Expires: Date | Fecha en la que la información deja de ser válida. El navegador la utiliza para determinar cuándo debe actualizarse una página. El formato de una cadena de fecha válida debe ser 01 Jan 1998 12:00:00 GMT. |
| Location: URL | Esta URL se refiere a la URL que debe devolverse, no a la URL solicitada. Puede usarla para redirigir una solicitud a cualquier archivo. |
| Last-modified: Date | Fecha de última modificación del recurso. |
| Content-length: N | Longitud de los datos a devolver, en bytes. El navegador utiliza este valor para indicar el tiempo estimado de descarga de un archivo. |
| Set-Cookie: String | MediantestringEstablecer cookie. |
Variables de entorno CGI
Todos los programas CGI pueden acceder a las siguientes variables de entorno. Estas variables desempeñan un papel muy importante al escribir programas CGI.
| Nombre de la variable | Descripción |
|---|---|
| CONTENT_TYPE | Tipo de datos del contenido. Se utiliza cuando el cliente envía contenido adicional al servidor. Por ejemplo, funciones como la subida de archivos. |
| CONTENT_LENGTH | Longitud de la información de la consulta. Solo disponible para solicitudes POST. |
| HTTP_COOKIE | Devuelve las cookies configuradas en forma de pares clave y valor. |
| HTTP_USER_AGENT | Campo de cabecera de solicitud de agente de usuario que proporciona información sobre la solicitud realizada por el usuario, incluyendo el nombre del navegador, la versión y otra información adicional de la plataforma. |
| PATH_INFO | Ruta del script CGI. |
| QUERY_STRING | Información codificada en URL cuando se envía una solicitud mediante el método GET, incluye los parámetros después del signo de interrogación en la URL. |
| REMOTE_ADDR | Dirección IP del host remoto que realiza la solicitud. Esto es muy útil para el registro de logs y la autenticación. |
| REMOTE_HOST | Nombre completamente calificado del host que realiza la solicitud. Si esta información no está disponible, se puede usar REMOTE_ADDR para obtener la dirección IP. |
| REQUEST_METHOD | Método utilizado para realizar la solicitud. Los métodos más comunes son GET y POST. |
| SCRIPT_FILENAME | Ruta completa del script CGI. |
| SCRIPT_NAME | Nombre del script CGI. |
| SERVER_NAME | Nombre de host o dirección IP del servidor. |
| SERVER_SOFTWARE | Nombre y versión del software que se ejecuta en el servidor. |
El siguiente programa CGI lista todas las variables CGI.
Ejemplo
Librería CGI C++
En ejemplos reales, necesita realizar muchas operaciones mediante programas CGI. Aquí hay una librería CGI escrita específicamente para programas C++; podemos descargarla desdeftp://ftp.gnu.org/gnu/cgicc/descargar esta librería CGI e instalarla siguiendo los pasos siguientes:

$ tar xzf cgicc-X.X.X.tar.gz $ cd cgicc-X.X.X/ $ ./configure --prefix=/usr $ make $ make install
Nota:Las librerías libcgicc.so y libcgicc.a se instalarán en el directorio /usr/lib; es necesario ejecutar el comando de copia:
$ sudo cp /usr/lib/libcgicc.* /usr/lib64/para que los programas CGI puedan encontrar automáticamente la librería de enlace dinámico libcgicc.so.
Puede hacer clic enC++ CGI Lib Documentationpara ver la documentación relacionada de la librería.
Métodos GET y POST
Es posible que haya encontrado una situación en la que necesite pasar información desde el navegador al servidor web y, finalmente, al programa CGI. Normalmente, el navegador utiliza dos métodos para enviar esta información al servidor web: los métodos GET y POST.
Enviar información usando el método GET
El método GET envía la información de usuario codificada añadida a la petición de la página. La página y la información codificada se separan mediante el carácter ?, como se muestra a continuación:
http://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2
El método GET es el método predeterminado para enviar información desde el navegador al servidor web. Genera una cadena larga en la barra de direcciones del navegador. Cuando envíe contraseñas u otra información sensible al servidor, no utilice el método GET. El método GET tiene una limitación de tamaño: se pueden enviar como máximo 1024 caracteres en una cadena de solicitud.
Cuando se utiliza el método GET, la información se envía mediante la cabecera HTTP QUERY_STRING, y se puede acceder a ella en un programa CGI mediante la variable de entorno QUERY_STRING.
Puede pasar información añadiendo pares clave-valor simples al final de la URL, o mediante el método GET de la etiqueta HTML <FORM>.
Ejemplo simple de URL: método GET
A continuación se muestra una URL simple que utiliza el método GET para pasar dos valores al programa cpp_get.cgi.
/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI
El siguiente ejemplo generacpp_get.cgiPrograma CGI para procesar la entrada proporcionada por el navegador web. Utilizando la biblioteca CGI de C++, se puede acceder fácilmente a la información pasada:
Ejemplo
Ahora, compile el programa anterior, como se muestra a continuación:
$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc
Genere cpp_get.cgi, colóquelo en el directorio CGI e intente acceder a él mediante el siguiente enlace:
/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI
Esto producirá el siguiente resultado:
名:ZARA 姓:ALI
Ejemplo simple de formulario: método GET
A continuación se muestra un ejemplo simple que utiliza un formulario HTML y un botón de envío para pasar dos valores. Usaremos el mismo script CGI cpp_get.cgi para procesar la entrada.
La siguiente es la salida real del formulario anterior. Introduzca el nombre y el apellido, y haga clic en el botón Enviar para ver el resultado.
Enviar información usando el método POST
Un método más fiable para pasar información a un programa CGI es el método POST. Este método empaqueta la información de la misma manera que el método GET, pero en lugar de pasarla como una cadena de texto después del ? en la URL, la envía como un mensaje separado. Dicho mensaje se pasa al script CGI a través de la entrada estándar.
Utilizamos también el programa cpp_get.cgi para procesar el método POST. Tomemos el mismo ejemplo, usando un formulario HTML y un botón de envío para pasar dos valores, excepto que esta vez usamos el método POST en lugar del método GET, como se muestra a continuación:
Pasar datos de casillas de verificación a un programa CGI
Cuando se necesitan seleccionar varias opciones, utilizamos casillas de verificación.
El siguiente ejemplo de código HTML es un formulario con dos casillas de verificación:
El siguiente programa en C++ generará el script cpp_checkbox.cgi, que se utiliza para procesar la entrada proporcionada por el navegador web mediante casillas de verificación.
Ejemplo
Pasar datos de botones de opción a un programa CGI
Cuando solo se necesita seleccionar una opción, utilizamos botones de opción.
El siguiente ejemplo de código HTML es un formulario con dos botones de opción:
El siguiente programa en C++ generará el script cpp_radiobutton.cgi, que se utiliza para procesar la entrada proporcionada por el navegador web mediante botones de opción.
Ejemplo
Pasar datos de área de texto a un programa CGI
Cuando se necesita pasar texto de varias líneas a un programa CGI, utilizamos el elemento TEXTAREA.
El siguiente ejemplo de código HTML es un formulario con un cuadro TEXTAREA:
El siguiente programa en C++ generará el script cpp_textarea.cgi, que se utiliza para procesar la entrada proporcionada por el navegador web mediante el área de texto.
Ejemplo
Pasar datos de lista desplegable a un programa CGI
Cuando hay varias opciones disponibles, pero solo se puede seleccionar una o dos, utilizamos una lista desplegable.
El siguiente ejemplo de código HTML es un formulario con una lista desplegable:
El siguiente programa en C++ generará el script cpp_dropdown.cgi, que se utiliza para procesar la entrada proporcionada por el navegador web mediante la lista desplegable.
Ejemplo
Uso de cookies en CGI
El protocolo HTTP es un protocolo sin estado. Sin embargo, para un sitio web comercial, es necesario mantener la información de sesión entre diferentes páginas. Por ejemplo, un usuario finaliza su registro después de completar varios pasos en diferentes páginas. Pero, ¿cómo mantener la información de sesión del usuario en todas las páginas web?
En muchos casos, el uso de cookies es el método más eficaz para recordar y rastrear información sobre las preferencias, compras, comisiones del usuario y otros datos necesarios para una mejor experiencia del visitante o para las estadísticas del sitio web.
Cómo funciona
El servidor envía algunos datos al navegador del visitante en forma de cookie. Si el navegador acepta la cookie, esta se almacena en el disco duro del visitante como un registro de texto plano. Luego, cuando el visitante accede a otra página del sitio, se recupera la cookie. Una vez encontrada la cookie, el servidor sabe qué se ha almacenado.
Una cookie es un registro de datos en texto plano con 5 campos de longitud variable:
- Expires :La fecha de caducidad de la cookie. Si este campo se deja vacío, la cookie caduca cuando el visitante cierra el navegador.
- Domain :El dominio del sitio web.
- Path :La ruta del directorio o página web que establece la cookie. Si desea recuperar la cookie desde cualquier directorio o página, este campo puede dejarse vacío.
- Secure :Si este campo contiene la palabra "secure", la cookie solo puede recuperarse a través de un servidor seguro. Si este campo se deja vacío, no existe dicha restricción.
- Name=Value :Las cookies se establecen y se obtienen en forma de pares clave-valor.
Configuración de cookies
Enviar cookies al navegador es muy sencillo. Estas cookies se envían junto con las cabeceras HTTP, antes del campo Content-type. Supongamos que desea establecer UserID y Password como cookies; los pasos para establecer las cookies son los siguientes:
Ejemplo
De este ejemplo aprendimos cómo establecer cookies. UsamosSet-Cookiela cabecera HTTP para establecer cookies.
Aquí, algunos atributos para establecer cookies son opcionales, como Expires, Domain y Path. Es importante destacar que las cookies se establecen antes de la línea"Content-type:text/html\r\n\r\nde envío.
Compile el programa anterior, genere setcookies.cgi e intente usar el siguiente enlace para establecer cookies. Establecerá cuatro cookies en su computadora:
/cgi-bin/setcookies.cgi
Obtener cookies
Recuperar todas las cookies establecidas es muy sencillo. Las cookies se almacenan en la variable de entorno CGI HTTP_COOKIE, y tienen la siguiente forma:
key1=value1;key2=value2;key3=value3....
El siguiente ejemplo demuestra cómo obtener las cookies.
Ejemplo
Ahora, compile el programa anterior, genere getcookies.cgi e intente usar el siguiente enlace para obtener todas las cookies disponibles en su computadora:
/cgi-bin/getcookies.cgi
Esto producirá una lista que muestra las cuatro cookies establecidas en la sección anterior, así como todas las demás cookies de su computadora:
UserID XYZ Password XYZ123 Domain www.w3cschool.cc Path /perl
Ejemplo de subida de archivos
Para cargar un archivo, el formulario HTML debe establecer el atributo enctype enmultipart/form-data. La etiqueta input con tipo file creará un botón "Examinar".
El resultado de este código es el siguiente formulario:
Nota:El ejemplo anterior ha deshabilitado deliberadamente guardar los archivos subidos en nuestro servidor. Puede probar el código anterior en su propio servidor.
El siguiente es el script utilizado para manejar la subida de archivos:cpp_uploadfile.cpp:
Ejemplo
El ejemplo anterior consiste encoutescribir contenido en el flujo, pero puede abrir un flujo de archivo y guardar el contenido del archivo subido en un archivo en la ubicación de destino.
Otras extensiones