Los scripts CGI pueden generar documentos HTML cuyo contenido varie dependiendo de los argumentos que se le pasen o de determinadas condiciones. De esta forma podemos hacer accesos a bases de datos, realizar compras, etc.
Al diseñar un CGI hay que crear la parte que el usuario ve, el programa y el resultado que se le presenta al usuario.
Para que un servidor pueda ejecutar CGI, hay que configurar adecuadamente el daemon.
En general, los scripts deben estar en un directorio concreto reservado para los mismos, de forma que si el URL indica un fichero en ese directorio, el servidor ve que es un programa y no una página HTML.
Si utilizamos el servidor del CERN, debemos editar el fichero httpd.conf, donde encontraremos una linea del tipo:
Exec /cgi-bin/* /home/www/cgi-bin/*
Puede haber varias líneas de este tipo, indicando que en esos directorios se
pueden colocar los CGI.
La segunda parte de la línea es el nombre a usar
para llamar a los CGI en las URL. La tercera parte es el camino físico en el
disco donde estará los CGI.
Si utilizamos el servidor de NCSA, en el fichero srm.conf debemos añadir una línea del tipo:
ScriptAlias /cgi-bin/ /home/www/cgi-bin/
Lo primero que debe hacer el script es informar del tipo de salida que va a dar como resultado (HTML, GIF, etc).
El tipo de documento se especifica en una línea del tipo:
Content-type: tipo_MIMEdonde tipo_MIME puede ser:
Tras esta linea, hay que enviar otra en blanco (dos retornos de carro). Por ejemplo, en Perl:
print "Content-type: text/html\n\n";
....
Una vez especificada la cabecera, hay que proporcionar el documento acorde al tipo especificado como cabecera. Los datos se envian al browser simplemente sacándolos por salida estándar.
Por ejemplo:
#!/usr/bin/perl print "Content-type: text/plain\n\n"; print "Mi primer CGI";mostrará en la ventana del browser del cliente el texto que aparece en el segundo print.
Es importante que los datos enviados al browser (sacados por salida estándar) sean compatibles con el formato especificado en la cabecera.
Por ejemplo, si indicamos que vamos a generar un fichero HTML, el browser interpretará correctamente los tags que incluyamos:
#!/usr/bin/perl print "Content-type: text/html\n\n"; print "<HTML>"; print "<BODY>"; print "<HR>"; print "<H1>Segundo CGI...</H1>"; print "<HR>"; print "</BODY>"; print "</HTML>";Probar el ejemplo...
Cuando ejecutemos un CGI a través de un browser, si el CGI tiene algún error de programación, el únco error que obtendremos será algo del tipo:
Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete your request. Please contact the server administrator, [email protected] and inform them of the time the error occurred, and anything you might have done that may have caused the error.lo cual no es muy útil a la hora de detectar los errores o depurar el programa.
Es conveniente (que no obligatorio) hacer uso de sentencias print cortas y claras, terminándolas con retornos de carro, para que el código HTML generado sea claro y fácil de depurar.
De esta forma, y antes de probar un script a través del browser, lo que haremos será ejecutarlo desde la línea de órdenes (shell), con lo cual, si hay errores, nos saldrá la línea/s donde los hay, y si todo está bien, nos imprimirá el código HTML que formaría la página a visualizar.
Por otro lado, si el código generado es fácil de seguir, nos será más fácil después ver porqué los elementos y la información generada para visualizar en el browser cliente no aparece como deseamos (si es que aparece mal).
#!/usr/bin/perl # parte activa del programa ($s,$m,$h, @resto) = localtime(time); # composicion del documento a mostrar print "Content-type: text/plain\n\n"; print "Hora actual: $h:$m:$s ";Probar el ejemplo...
#!/usr/bin/perl
# composicion del documento a mostrar
print "Content-type: text/html\n\n";
print <<escribiendo;
<html>
<body>
escribiendo;
foreach $clave (keys(%ENV)) {
print "$clave = $ENV{$clave} <BR>\n";
}
print "</body></html>\n";
Probar el
ejemplo...
El ejemplo que pondremos aqui simplemente es llamado y cuenta el número de argumentos pasados y los muestra si ha habido alguno:
#!/usr/bin/perl
# composicion del documento a mostrar
print "Content-type: text/plain\n\n";
if( $#ARGV < 0 ) {
print "NO hay argumentos \n";
}else{
print "SI hay argumentos (del 0 al $#ARGV) \n";
for($i=0; $i <= $#ARGV ;$i++){
print "$i $ARGV[$i] \n";
}
}
Probar el
ejemplo...