Cuando el World Wide Web inició su funcionamiento como lo conocemos, empezando a tomar popularidad aproximadamente en 1993, solo se podía apreciar texto, imágenes y enlaces. La introducción de Plugins en los navegadores permitió mayor interactividad entre el usuario y el cliente, aunque estaba limitado por la velocidad y la necesidad de tener que bajar e instalar cada plugin que se necesitara, por lo que estos se desarrollaron mayormente en áreas de vídeo, audio y realidad virtual.


El CGI (Por sus siglas en inglés "Common Gateway Interface") cambio la forma de manipular información en el web.

 

Es la parte de un servidor de Web que recoje las entradas y llamadas de otros programas para procesarlos. Estos programas son tipicamente llamados programas CGI o CGI scripts y pueden ser escritos en varios lenguajes de programación, como PERL o C. CGI es un estandar más viejo comparado con el más nuevo que es la  tecnología ISAPI.  


En sí, es un método para la transmisión de información hacia un compilador instalado en el servidor. Su función principal es la de añadir una mayor in
teracción a los documentos web que por medio del HTML se presentan de forma estática.

 

CGI es un estándar que nos sirve para comunicar aplicaciones externas con los servidores de información, como, por ejemplo, los servidores http (web). Un documento en HTML que importamos es estático: una especie de fichero de texto que no cambia. Por el contrario, un programa CGI se ejecuta en tiempo real, de forma que se genera una información dinámica y constantemente actualizada.

 

Vamos a suponer, por ejemplo, que tenemos una base de datos en UNIX, sobre la reproducción de la lagartija roquera... J , y que queremos engancharla al WWW para que los millones de aficionados a los reptiles en el mundo puedan consultarla. Básicamente, necesitaremos un programa CGI que el ‘demonio’ o ‘daemon’ (un programa robotizado) ejecutará para transmitir información al gestor de la base de datos, recibir la notificación de éste y transmitírsela al cliente. En este caso, el demon de WWW actuaría como pasarela (Gateway), y de eso se trata precisamente en los programas CGI.

 

Los programas en CGI añaden funcionalidad al servidor Web, funcionalidad que podría abrir agujeros de seguridad en el servidor, ya que una aplicación en CGI mal diseñada podría permitir acceso total o parcial al servidor.


El CGI es utilizado comúnmente para contadores, bases de datos, motores de búsqueda, formulários, generadores de email automático, foros de discusión, chats, comercio electrónico, rotadores y mapas de imágenes, juegos en línea y otros.


Esta tecnología tiene la ventaja de correr en el servidor cuando el usuario lo solicita por lo que es dependiente del servidor y no de la computadora del usuario.

De acuerdo a la traducción de la NCSA: "Un documento HTML es estático, lo que significa que existe en un estado constante; es un archivo de texto que no cambia. Un script CGI por otro lado, es ejecutado en tiempo real, lo que permite que regrese información dinámica. Por ejemplo, digamos que quieres conectar tus bases de datos de Unix al World Wide Web para permitir que las personas de todo el mundo la manipulen. Básicamente, lo que debes hacer es crear un script CGI que será ejecutado por el servidor para transmitir información al motor de la base de datos, recibir los resultados y mostrarselos al cliente. Este es un ejemplo sencillo que muestra donde el CGI tiene sus origenes".

Las aplicaciones y programas en CGI, suelen distinguirse entre programas (programs) y guiones (scripts).

Los primeros se consideran escritos en algún lenguaje compilado como C, VB, Pascal, Clipper, etc,  mientras que los segundos son los escritos en un lenguaje interpretado como Perl, Shell de Unix, etc.

En general, es necesaria la presencia de dos elementos, una página Web en formato HTML con un formulario donde el usuario introduce sus datos, y un programa CGI en el servidor, que recibe y procesa los datos del usuario.

Especificaciones

Un programa CGI es tan ejecutable como un programa EXE o COM, lo cual trae aparejados una serie de riesgos: si conectas tu PC como servidor a la WWW, utilizar un CGI equivale a dejar que todo el mundo ejecute un programa en tu sistema, lo que no es lo más seguro que se puede hacer. Para evitar el riesgo que implica el que una serie de desconocidos anden ejecutando programas en tu ordenador, hay que tomar una serie de precauciones antes de usar un programa CGI.

 

Para el usuario normal del Web, la única diferencia aparente es que los programas CGI necesitan estar almacenados en un directorio especial, de forma que el servidor sepa que tiene que ejecutarlos, no simplemente mostrarlos en pantalla. Este directorio suele estar bajo control directo del webmaster o servidor de almacenamiento de la web, prohibiéndose al usuario normal crear programas CGI. Para cualquier dato referente a scripts CGI, deberás conectarte con tu servidor, que es el único que puede autorizarte a incluir CGI en su sistema

 

Un programa CGI se puede escribir en cualquier lenguaje de programación que pueda ser ejecutado por el sistema, por ejemplo, C, C++, Fortran, Perl, TCL, Visual Basic, AppleScript, etc. En realidad, todo depende de lo que haya en el sistema que lo va a hospedar.

Normalmente, puedes ver el código fuente de algunos programas del directorio /cgi-bin (en el que se almacenan los scripts CGI) abriendo el directorio /cgi-src, lo que te permitirá saber que lenguajes acepta el servidor. Si utilizas Perl, TCL o un shell de UNIX, no tienes que preocuparte por el lenguaje, ya que se trata de lo que se llama ‘lenguajes interpretados’, es decir, que no están asociadoa a un código fuente en concreto. Por este motivo, así como por el hecho de que son más fáciles de depurar, modificar y mantener que los típicos programas que precisan compilación (Visual Basic, C, C++), están apareciendo cada vez más programas del tipo CGI, en lugar de los antiguos EXE y COM.


El funcionamiento de esta tecnología es muy sencillo. Los scripts residen en el servidor, donde son llamados, ejecutados y regresan información de vuelta al usuario.

 

En general podemos decir que una aplicación CGI consta de tres fases:

 

Para una mejor aclaración presentamos la siguiente gráfica:


 

 


Un ejemplo de un llamado a un script CGI puede ser:
http://www.maestrosdelweb.com/cgi-bin/ejemplo.cgi

Hay que tomar muy en cuenta que existen dos formas de enviar información; siendo estas por medio de GET y POST.


El primero envía la información dentro del URL separando los campos con signos de interrogación '?' antes de la información, como por ejemplo:
http://www.maestrosdelweb.com/cgi-bin/ejemplo.cgi?nombre=Christian&cargo=Webmaster

Esta forma presenta varias desventajas, ya que no permite manejar grandes cantidades de información y por ser una dirección, los Caches de los navegadores pueden guardar los resultados, lo que dificulta el poder acceder nuevamente a la aplicación, pero simplifica el uso de los scripts con solo utilizar una dirección URL.

 

Los datos  enviados con GET se recibirán por líneas de comandos y la variable de entorno QUERY_STRING.

 

El CGI lo recibe por medio de una variable de entorno lo que significa una restriccion en el tamaño de los datos. El Browser envía los datos visiblemente haciendo una llamada de la forma: .../cgi-bin/cgi.pl?campo=algo.


Es la forma como se llaman cgis desde fuera de un formulario, por ejemplo los contadores de visitas son habitualmente llamados de la forma:
<img src="Count.cgi?df=cgimaster2">


La otra forma de enviar la información es por medio de POST, el cual envía la información directamente al servidor, haciendolo invisible en el URL y permitiendo cualquier cantidad de información, como el envío de archivos.

 

El CGI recibirá los datos enviados
con POST leyendo la entrada estándar,

 

Las diferencias entre GET y POST son primordiales para adaptar una aplicación y hacerla funcionar.

 

Existe una grán cantidad de código gratuito disponible para iniciar, pero es necesario contar con un servidor adecuado y que soporte esta tecnología, asi como la modificación de permisos dentro de sus directorios. La forma más facil de hacer pruebas es con el compilador Perl que viene incluido en cualquier plataforma Unix o derivada como es el caso de Linux. En otras plataformas de 32 bits como Windows puede ser instaldo el Perl32.

 

¿Qué es el directorio /cgi-bin?

Se trata del directorio en que se guardan los scripts, preparado especialmente para esta función en el servidor de http. Por ello, el servidor sabe que el contenido de este directorio contiene ejecutables y que, después de ejecutados, su resultado deberá ser enviado al navegador del cliente. El directorio /cgi-bin no es un directorio cualquiera que podamos crear por los métodos normales, sino que debe ser cuidadosamente configurado por el administrador del sistema. Si no se realizase esta configuración, el cliente vería simplemente los scripts como documentos de texto.

Existen, no obstante, servidores configurados de tal forma que todos los archivos de una determinada extensión, generalmente .CGI, se consideran como si se encontrasen en el directorio /cgi-bin, y se ejecutan automáticamente, aunque no se encuentren realmente en él.

 

 

Capítulo 1: Escribiendo nuestro primer CGI

 

Capitulos del Tutorial:


Escribiendo nuestro primer CGI.

 Definición y uso devariables.


Bienvenidos al tutorial de CGI en español.


En este tutorial se cubrirán varios aspectos que te ayudaran a empezar a programar aplicaciones CGI para el interprete Perl.


Si necesitas mayor información sobre CGI y Perl puedes ver el artículo introductorio a CGI en este sitio y que además comprende algunos enlaces interesantes.

Bueno, por donde empezamos?

 
Claro, para iniciar, este tutorial esta pretendido para programar CGIs que funcionen por medio del interprete Perl en un sistema UNIX. En caso de que no cuenten con un sistema Unix, también pueden conseguir una copia de Perl32 en www.perl.com que funcionará en Windows NT.


El CGI, al igual que el HTML que necesita cierta estructura para funcionar como por ejemplo, las tags <HTML> y <HEAD> debe iniciar siempre en la primera línea con una declaración donde se le indique la locación del intérprete Perl:

 

1. #!/usr/bin/perl

 

Para averiguar la dirección de Perl en el sistema, podemos ir a la línea de comando y escribir el comando:

 

which perl

 

luego de haber definido esta línea, ya podemos iniciar a escribir código para la aplicación.

En esta lección aprenderemos a escribir una página de respuesta en HTML como resultado de una aplicación CGI.


El comando que se utiliza para escribir en CGI es print y para enviar al navegador una página HTML, se debe iniciar así:

 

2. print "Content-type:text/html\n\n";

 

Esta línea de código envía al navegador la instrucción de que el siguiente contenido será escrito en texto HTML y se utiliza \n para dejar espacios verticales. El contenido de el comando print, debe ser colocado entre comillas. Siempre al terminar una declaración se utiliza ; para finalizar.


Para continuar y luego de está línea podemos seguir escribiendo líneas de código HTML:

 

3. print "<HTML>\n";
4. print "<HEAD><TITLE>Mi primer CGI</TITLE></HEAD>\n";
5. print "<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\">\n";
6. print "<H1>Este es el resultado de mi primer CGI</H1>\n";
7. print "</BODY>\n";
8. print "</HTML>\n";

 

Incluir HTML dentro de una aplicación CGI es sencillo. En este ejemplo se puede explicar otra cosa muy importante: Al utilizar el comando print se deben utilizar comillas, pero también como parte del HTML se escriben comillas, como se muestra en la línea 5. Para que esto no sea problema, es necesario incluir una diagonal invertida \ antes de cualquier comilla que incluya el HTML para evitar errores de sintaxis.
Existe también otra forma de escribir CGI sin escribir distintas instrucciones y que entre otros, permite que utilicemos CGI sin necesidad de modificarlo con diagonales invertidas:

 

3. print qq|
4. <HTML>
5. <HEAD><TITLE>Mi primer CGI</TITLE></HEAD>
6. <BODY BGCOLOR="#FFFFFF" TEXT="#000000">
7.
<H1>Este es el resultado de mi primer CGI</H1>
8. </BODY>
9. </HTML>
10. |;

 

Como se puede observar, es más fácil de utilizar esta forma, pero hay que ser muy cuidadosos, pues se pueden causar errores de sintaxis. Por ejemplo, en la línea 10, está la instrucción que cierra la línea de impresión. Esta instrucción debe estar tabulada igual que el resto del código que aparece desde la línea 3 y no debe existir espacios antes de ella o se producirá un error.


En resumen, el código completo para esta aplicación es el siguiente:

 

1. #!/usr/bin/perl
2. print "Content-type:text/html\n\n";
3. print "<HTML>\n";
4. print "<HEAD><TITLE>Mi primer CGI</TITLE></HEAD>\n";
5. print "<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\">\n";
6. print "<H1>Este es el resultado de mi primer CGI</H1>\n";
7. print "</BODY>\n";
8. print "</HTML>\n";

Y bueno, con este código ya es posible imprimir desde una aplicación CGI hacia HTML en nuestro navegador. El código completo en forma de texto se encuentra en el archivo.


Si hay algún error al probarlo, hay una guía para Solventar errores en aplicaciones CGI que te será de utilidad.


Cualquier comentario respecto al tutorial les será agradecido para mejorar los próximos capitulos.

 

PRIVATECapítulo 2: Definiendo variables y ejemplo de su uso

Capitulos del Tutorial:


Escribiendo nuestro primer CGI.

Definición y uso de variables.

 

Ya aprendimos anteriormente a imprimir una página web desde un documento. A continuación veremos la aplicación y definición de las variables en nuestros programas CGI.


Para iniciar diremos que una variable es un espacio donde puede almacenarse información para utilizara durante la ejecución de nuestro programa.
A diferencia de muchos lenguajes de programación, Perl es algo desordenado. Para utilizar una variable basta con definirla en cualquier parte de nuestro programa y no hay necesidad de declarar si es numérica, alfanumérica, etc.
Se pueden utilizar 3 tipos de variables que son: scalars (escalares), arrays (conjuntos) y hashes (conjuntos definidos).


Las variables scalars (escalares) almacenan información de un solo valor. Para definirlas utilizamos el signo de dólar ($) antes del nombre de la variable que puede ser $variable1, $mw, $1, etc.


Estas variables se utilizan de la siguiente forma:

 

$variable1 = "Hola amigo";
$mw = 1999;

 

Para definir el valor que contine una variable se utilizan las comillas (" "), incluyendo entre comillas los contenidos alfanuméricos y los de valor numérico sin comillas. El valor de una variable puede cambiar según lo requiera el programa y podemos hacer que una variable numérica se convierta en una alfanumérica sin problema.

 

$ejemplo = 1999;
$ejemplo = "Sabías que estamos en el año $ejemplo";

 

Para explicar mejor el funcionamiento de un las variables escalares tenemos el siguiente ejemplo

 

1. #!/usr/bin/perl
2. $Titulo = "Mi primer ejemplo de variables";
3. $Numero = 78;
4. print "Content-type:text/html\n\n";
5. print "<HTML>\n";
6. print "<HEAD><TITLE>$Titulo</TITLE></HEAD>\n";
7. print "<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\">\n";
8. print "<H1>$Titulo</H1>\n";
9. print "<H2>Mi número de la suerte es el $Numero</H2>\n";
10. print "</BODY></HTML>\n";

 

Como pudimos apreciar, al correr este programa, las variables que definimos al principio son incrustadas en el código que se imprime. Además, las variables pueden ser utilizadas todas las veces que lo necesitemos..
El código del programa anterior puede ser tomado del archivo ejemplo2a.txt para un mejor manejo.


Continuando con el segundo tipo de variables, nos encontramos con las arrays (conjuntos) que como lo indica su nombre, sirven para almacenar un conjunto de valores, a diferencia de las scalars que almacenan un solo valor. Para definir este tipo de variables se utiliza el signo de arroba (@) antes del nombre de la variable y se utilizan de la siguiente manera:

 

@dias = ("lunes","martes","miercoles","jueves","viernes","sabado","domingo");

 

Una vez definida la variable de tipo de tipo array, para utilizar los valores se utilizan variables de tipo scalar, ya que serán manejados individualmente. Asi, para seleccionar el segundo valor de @dias utilizamos el comando $dias[1]. Hay que tomar en cuanta que la númeración inicia desde 0, por lo que para utilizar el primer valor utilizariamos $dias[0]. A continuación ejemplificaremos el uso de estas variables:

 

1. #!/usr/bin/perl
2. $Titulo = "Mi segundo ejemplo de variables";
3.
@habiles = ("lunes","martes","miercoles","jueves","viernes");
4. print "Content-type:text/html\n\n";
5. print "<HTML><HEAD><TITLE>$Titulo</TITLE></HEAD>\n";
6. print "<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\">\n";
7. print "<H3>Mis días habiles son:</H3>\n";
8. print "<H4>$habiles[0],</H4>\n";
9. print "<H4>$habiles[1],</H4>\n";
10. print "<H4>$habiles[2],</H4>\n";
11. print "<H4>$habiles[3],</H4>\n";
12. print "<H4>$habiles[4],</H4>\n";
13. print "</BODY></HTML>\n";

y mejor aún, podemos simplificar este proceso con el comando foreach que por medio de un ciclo, nos facilita el trabajo, quedando el código así:

 

1. #!/usr/bin/perl
2. $Titulo = "Mi segundo ejemplo de variables";
3.
@habiles = ("lunes","martes","miercoles","jueves","viernes");
4. print "Content-type:text/html\n\n";
5. print "<HTML><HEAD><TITLE>$Titulo</TITLE></HEAD>\n";
6. print "<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\">\n";
7. print "<H3>Mis días habiles son:</H3>\n";
8. foreach $variable (@habiles) {
9. print "<H4>$variable,</H4>\n";
10. }
11. print "</BODY></HTML>\n";

 

Como apreciamos, el comando foreach repite el proceso que se le indica entre las { }, lo cual es muy efectivo al manejar procesos que tienen una secuencia.
El código del programa anterior puede ser tomado del archivo ejemplo2b.txt para un mejor manejo.


Como las arrays son conjuntos de elementos, Perl tiene algunos comandos que nos permite manipular los valores que estos tienen:

 

@meses = ("enero","febrero","marzo");

sort(@meses);
Ordena los valores alfabéticamente
reverse(@meses); Invierte los valores
$ultimo = pop(@meses); Muestra el último valor (marzo)
$primero = shift(@meses); Muestra el primer valor (enero)
push(@meses,"abril"); Incluye el valor (abril) al final de el array @meses
$#meses Muestra el tamaño del array @meses

 

Finalizando con los tipos de variables, nos toca hablar de las del tipo hashes (conjuntos definidos) y que son como las arrays pues funcionan como conjuntos pero con valores relacionados. Así, podemos decir que los hashes se componen de una definición y su información. Para definirlas se utiliza el signo de porcentaje (%) y se utilizan de las siguiente forma:

 

%emails = ( "carlos" => "carlos\@maestrosdelweb.com",
"pedro" => "pedro\@maestrosdelweb.com",
"mario" => "mario\@maestrosdelweb.com",
"tomas" => "tomas\@maestrosdelweb.com");

 

Como observamos, a cada nombre se le asigna un valor que representa su email. Así es como funcionan los hashes, definiendo un valor para cada definición.
Otra cosa que aprendemos en este ejemplo es que antes de escribir el signo de arroba (@) cuando es parte de un valor, debe de tener anteriormente la diagonal invertida (\) para que el programa no lo confunda con una array.

Ahora, para tomar el valor de cada uno de las definiciones que hay en las hashes, se utiliza un sistema muy similar al que utilizamos anteriormente con los arrays. Por ejemplo, para tomar el valor del email de mario, utilizaríamos $emails{'mario'} Para ejemplificar el uso que podemos darles a los hashes se presenta el siguiente ejemplo:

 

1. #!/usr/bin/perl
2. $Titulo = "Mi tercer ejemplo de variables";
3.
%emails = ( "carlos" => "carlos\@maestrosdelweb.com",
4. "pedro" => "pedro\@maestrosdelweb.com",
5. "mario" => "mario\@maestrosdelweb.com",
6.
"tomas" => "tomas\@maestrosdelweb.com");
7. print "Content-type:text/html\n\n";
8. print "<HTML><HEAD><TITLE>$Titulo</TITLE></HEAD>\n";
9. print "<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\">\n";
10. print "<H3>Los emails de mis amigos:</H3>\n";
11. foreach $nombre (keys %emails) {
12. print "<H4><A HREF=\"mailto:$emails{$nombre}\">$nombre</A></H4>\n";
13. }
14. print "</BODY></HTML>\n";

 

Las hashes entonces le adhieren más funciones a la variables. Podemos diseñar con esto en mente un directorio de emails o de enlaces, fácilmente administrable y que podemos cambiar sin mucho esfuerzo.
El código del programa anterior puede ser tomado del archivo ejemplo2c.txt para un mejor manejo.


Recuerden que si alguno de sus programas CGI les causa algún error, pueden consultar la guía para Solventar errores en aplicaciones CGI de este sitio.

Con esto finalizamos la explicación de los tipos de variables que podemos manejar en Perl.


Para el próximo capítulo de este tutorial veremos una pequeña reseña de manejo de formas y envió de email desde un programa CGI.