Índice
Introducción
Cómo funciona
Independencia
Escribiendo un programa CGI.
Variables de entorno.
Establecimiento de la comunicación con el cliente
Referenciar un CGI
Los formularios y CGI
Envío de información del servidor al CGI
Introducción a CGI
SubEs de las primeras formas de programación web dinámica.
El CGI cambio la forma de manipular información en el web. Antes: relación cliente-servidor mediante plugins y limitada por la velocidad.
Es un método para la transmisión de información hacia un compilador instalado en el servidor.
Introducción a CGI
SubFUNCIÓN PRINCIPAL: Añadir una mayor interacción a los documentos web (devuelve información dinámica) que por medio del HTML (se presentan de forma estática).
Corre en el servidor ? No depende del usuario.
Uso: contadores, bases de datos, motores de búsqueda, formularios, 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.
Introducción a CGI
El procesamiento puede hacerlo totalmente el CGI (Procesamiento Directo).
El CGI sirve de puente para otro programa con otro propósito (Procesamiento Indirecto).
Como funciona
Funcionalidad de las paginas web que contengan programación CGI:
Acción conjunta del Servidor Web y el programa almacenado (script CGI).
Script CGI: Programa que se ejecuta en el servidor en respuesta a una solicitud del usuario.
Lenguajes de programación: Basic, Java, C, Perl…
Deben leer los datos de la entrada estándar
Acceder a las variables de entorno
Escribir en la salida estándar.
Independencia
Independiente de:
Hardware
Software y SO.
Servidor
No asume rutas
No asume IPs
No asume permisos.
Escribiendo un programa CGI
Entrada estándar: stdin.
Salida estándar: stdout.
Se puede generar cualquier tipo de documento.
Toda salida del programa CGI debe estar precedida por una cabecera tipo MIME
Salida en formato visualizable por el navegador (no siempre).
Escribiendo un programa CGI
#include < stdio.h>
Int main(int argc, char *argv[])
{
printf(Content-type:texyt/htmln);
printf(n);
printf(< HTML>n< BODY>n);
printf(Mi primer CGIn);
printf(< /HTML>n< /BODY>n);
return 0;
}
Cabecera
Línea
Separación
Cuerpo
Escribiendo un programa CGI
#include < stdio.h>
Int main(int argc, char *argv[])
{
//
printf(Location: http://www.ua.esn);
printf(n);
//
return 0;
}
Link a otra pagina web:
VARIABLE DE ENTORNO CGI
Transmiten datos acerca de una petición de un servidor al CGI.
Variable sin valor o sin definir=NULL.
Existen de 3 tipos:
Especificas de servidor
Especificas de cliente
Especificas de la petición
VARIABLE DE ENTORNO CGI: Especificas del servidor
Características del servidor:
GATEWAY_INTERFACE. -versión del servidor (ej: CGI/1.1)
SERVER_NAME. -Nombre del servidor (ej: www.ua.es)
SERVER_PORT. -Puerto del servidor donde se recibió la petición (ej:80)
SERVER_PROTOCOL. -Nombre del protocolo de petición (ej: HTTP/1.1)
SERVER_SOFTWARE. -Nombre del software del servidor (ej:Microsoft– IIS/4.0)
VARIABLE DE ENTORNO CGI: Especificas del cliente
Informacion sobre el navegador
HTTP_ACCEPT: image/gif, image/jpeg
HTTP_ACCEPT_ENCODING: gzip, deflate
HTTP_ACCEPT_LANGUAGE: es-ES, en, pdf
HTTP_REFERER: http://www.ua.es/index.html
HTTP_USER_AGENT: Mozilla/4.7 [en] (Win98; I)
VARIABLE DE ENTORNO CGI: Especificas de la petición
Información sobre la petición recibida:
CONTENT_LENGTH -Tamaño en números decimales de octetos y cualquier otra entidad adjunta
PATH_INFO -Ruta que debe interpretar una aplicación CGI
QUERY_STRING -Cadena de búsqueda URL-encoded.
REMOTE_ADDR -Dirección IP del agente que hace la petición
REMOTE_HOST -Nombre del dominio que realiza la petición
REQUEST_METHOD -Metido de petición por el cliente.
SCRIPT_NAME -URI para identificar la aplicación CGI
VARIABLE DE ENTORNO CGI: Especificas de la petición
Información sobre la petición recibida:
CONTENT_TYPE -El tipo MIME de una entidad adjunta
Tipos:
Aplication -transmiten datos de la aplicación
Text -Información textual (ej: plain)
Multipart -Partes múltiples de tipos de datos independientes( ej: mixed, alternative..
Message -Un mensaje encapsulado (ej: partial, External-body)
Image -Datos de imagen (ej: gif, jpeg)
Audio – Datos de audio (ej: basic)
Video -Datos de video (ej mpeg)
VARIABLE DE ENTORNO CGI: ACCESO DESDE C
#include < stdio.h>
char *variable;
Variable=getenv(SERVER_NAME);
}
Establecimiento de la comunicación con el cliente
El servidor añade a la respuesta del CGI mas datos para devolver un mensaje HTTP correcto.
Si no se quiere que el servidor trate los datos devueltos por el CGI: Añadir el prefijo nph-(No Parser Header) al nombre del CGI.
Referenciar un CGI
Usando etiquetas HTML
< a href=direccion_del_CGI>texto < /a>
ej:< a href=http://www.zonaweb.es/cgi-bin/hora.cgi>Dime la hora < /a>
Usando un formulario(lo más habitual)
< form action=direccion_del_CGI>< !– elementos del formulario–>< /form>
LOS FORMULARIOS Y CGI
Uso de GET
Se utiliza para obtener un fichero o recurso
La vble de entorno QUERY_STRING lee los datos
Tamaño limitado: 256 caracteres
No registra cada petición
Uso de POST
Se usa para enviar datos al servidor
Los datos se leen por la entrada estandar
Tamaño ilimitado (CONTENT_LEGTH devuelve el tamaño)
Registra cada petición
LOS FORMULARIOS Y CGI
El navegador envía los datos de la siguiente forma:
ej: control1=valor1& control2=valor2& control3=valor3
Para campos sin valor:
ej control1=& control2=valor2& control3=valor3
Caracteres para dividir los datos:
&: Separa las diferentes parejas campo/valor.
=: Separa el campo de su valor
%xx: identifica los caracteres especiales
+: Para codificar los espacios.
Envio de informacion del servidor al CGI: Línea de comandos
? :Separa el CGI de los argumentos
+ : separa los argumentos entre sí.
Cada palabra es un parámetro que le llega al CGI (argv).
Los datos se encuentran en QYERY_STRING.
< a href=/cgi-bin/cgi?arg1+arg2+arg3>enlace< /a>
Envio de informacion del servidor al CGI: Entrada estandar
Envío mediante un formulario con POST.
Se recibe por la entrada estándar
Uso de las vbles:
CONTENT_LENGTH
CONTENT_TYPE
Envio de informacion del servidor al CGI: Información de ruta de directorios
Utilizando la vble de entorno PATH_INFO.
< a href=/cgi-bin/cgi/MasInformación?arg1+arg2+arg3>enlace< /a>
Envio de informacion del servidor al CGI: URL
Envio mediante formularios con GET.
Formato: nom_cgi?campo1=valor1&camop2=valor2
Los datos los recibe la vble QUERY_STRING.
Ej: < a href=programaCGI.exe?arg1=1&arg2=5>pincha aquí < /a>
Ejemplo con formulario:
< html>
< head>< title>ejemplo de CGIs con Formulario
< /title>< /head>
< body>
< form action="form.cgi" method="get">
< tr>
< td>< b>Ejemplo de Formulario< /b>< br>
< br>
< /td>
< /tr>
< tr>< td>Nombre< /td>
< td>< input type="text" maxlength="160" size="40" name="nombre">
< /td>
< br>
< /tr>
< tr>< td>Color< /td>
< td>< SELECT NAME="color">
< OPTION>Blanco
< OPTION>Azul
< OPTION>Rojo
< /SELECT >
< /td>
< /tr>
< tr>< td>País< /td>
< td>< SELECT NAME="pais">
< OPTION value="cl">Francia
< OPTION value="es">España
< OPTION value="zz">Portugal
< /SELECT >
< /td>
< br>
< /tr>
< tr>
< td>< INPUT TYPE="submit" VALUE="Enviar datos">
< /td>
< /tr>
< /table>
< /form>
< /body>
< /html>
Ejemplo con formulario:
#include < stdio.h>
#include "cgiforms.h"
#define LARGO_MAXIMO 1024
void imprimeVariable( char *lpzNombre );
main(){
printf("Content-Type: text/htmlnn");
printf("< html>< body bgcolor=#ffffff text=#ffffff>n");
printf("< p align=center>< table cellpadding=4 bgcolor=000000>n");
printf("< tr>< td color=000080 align=center>");
printf("< b>Campos recibidos desde el Form< /b>< /td>< /tr>n");
imprimeVariable( "nombre" );
imprimeVariable( "color" );
imprimeVariable( "pais" );
printf("< /table>n");
printf("< /body>< /html>");
return( 0 );
}
void imprimeVariable( char *lpzNombre ){
/*** recibe el nombre de la variable yla imprime
formateada como celdas de una tabla***/
char lpzResultado[LARGO_MAXIMO];
printf("< tr>n");
printf("< td bgcolor="#9999FF" valign=top>%s< /td>n",Nombre);
printf("< td bgcolor="#DDDDFF" valign=top>< font color=#000000>");
/***aqui pide la variable y luego la imprime***/
formPideVariable( lpzNombre,lpzResultado,LARGO_MAXIMO);
printf(¨[%s]",lpzResultado);
printf("< /td>n");
printf("< /tr>n");
Ejemplo con formulario: