A partir de esta conferencia, ingresaremos al proceso de aprendizaje de la programación CGI. A través de las conferencias anteriores, ha dominado los conocimientos básicos de la programación CGI. ¡Ahora puedes sentarte y escribir tu programa CGI!
3. Programación CGI
1. Conexión del lado del servidor (SSI) y puerta de enlace
2. Gateway: conecta otros protocolos a través de WEB
En el proceso de escribir programas CGI, es mejor seguir los siguientes puntos de diseño de la aplicación:
(1) Haga una pregunta: el problema que desea resolver
(2) Etapa de diseño: concebir el marco básico y las funciones del programa CGI.
(3) Etapa de codificación: hacer realidad ideas con acciones
(4) Trasplante de programa: escribir código portátil
(5) Luchar por la excelencia: llevar el programa a un nivel superior
1. Conexión del lado del servidor (SSI) y puerta de enlace
En esta sección presentaremos el adjunto del lado del servidor SSI (Server Side Include) y la puerta de enlace. Estrictamente hablando, SSI no es parte de la programación CGI, pero SSI puede realizar algunas tareas que los programas CGI simples pueden realizar y, a veces, SSI es incluso la mejor opción. Por lo tanto, aquí se ofrece una breve introducción.
SSI define un conjunto de comandos incrustados en el texto HTML Antes de que el texto HTML se envíe al cliente HTTP, el servidor WEB preprocesa estos comandos SSI y envía el texto HTML procesado al navegador del cliente HTTP.
El formato de comando de SSI es:
< !--# comando parámetro="valor" -->
Los comandos SSI se diferencian de Java o JavaScript en que se procesan en el lado del servidor en lugar de en el lado del cliente. Esto es similar a los programas CGI. Por supuesto, dentro del alcance funcional de SSI, sus ventajas son las mismas que las de los programas CGI. Puede mejorar la utilización de recursos del servidor y cualquier navegador WEB del cliente puede explorar texto HTML que contenga SSI.
Los siguientes son seis comandos SSI de uso común:
(1) Incluir comando
(2) comando de eco
(3) comando ejecutivo
(4) comando de configuración
(5) comando fsize
(6) comando flashmod
incluir comando
El único parámetro admitido es archivo, que inserta el contenido del archivo especificado por el parámetro de archivo en el texto HTML actual. Si conoce el lenguaje C, podrá ver que tiene la misma función que el comando "#include" en el lenguaje C. Por ejemplo, hay dos textos HTML: main.html y header.html. Utilice el comando de inclusión en main.html: main.html:
<html>
<tilte>Prueba Incluir comando SSI</ /title>
<!--#include file="encabezado.html" -->
<cuerpo>
¡El encabezado anterior proviene de header.html!
< /cuerpo>
< /html>
encabezado.html:
<H1> ¡Este es un título en header.html!</H1>
(Sin embargo, parece que OmniHTTPD no admite el comando de inclusión: <!)
comando de eco
El único parámetro admitido es var, que se utiliza para mostrar variables proporcionadas por el servidor, por ejemplo:
DOCUMENT_NAME: nombre del archivo actual
DOCUMENT_URL: ruta relativa al texto SSI
DATE_LOCAL: fecha local
DATE_GMT: fecha GMT (hora estándar de Creenwich)
LAST_MODIFIED: la última fecha de modificación del archivo que contiene este comando SSI
HTTP_USER_AGENT: nombre del navegador.
Por ejemplo: principal.shtml <html>
Este documento se actualizó por última vez el <!--#echo var="LAST_MODIFIED"-->
< /html>
Cuando abre main.shtml con un navegador, puede ver la hora de la última modificación. (Cabe señalar que main.shtml debe almacenarse en el directorio HtDocs de OmniHTTPD y accederse a él en el navegador utilizando la dirección http://localhost/main.shtml).
comando ejecutivo
Los dos parámetros son cgi y cmd. El primero llama a un archivo ejecutable, como cgi="/cgi-bin/finger.cgi"; el segundo llama a un comando del sistema, como cmd="ls". Desafortunadamente, OmniHTTPD no admite este comando SSI (quizás la última versión sí lo haga ahora).
comando de configuración
Este comando establece la forma en que el servidor maneja archivos y muestra fechas. Tiene dos parámetros:
(1) timefmt, determina el formato para mostrar las fechas. Utilice man strftime en UNIX para consultar los valores disponibles.
(2) sizefmt, determina el formato para mostrar la longitud del archivo. El valor es bytes o dirección. Este comando tampoco es compatible con OmniHTTPD.
comando fsize
Este comando muestra el tamaño de un archivo determinado. El parámetro es archivo, especificando la ruta y el nombre del archivo.
comando flashmod
Este comando muestra la última fecha de modificación del archivo especificado. El parámetro es archivo, especificando la ruta y el nombre del archivo.
2. Gateway: conecta otros protocolos a través de WEB
El protocolo HTTP no puede acceder a todos los recursos de Internet. Cuando desea acceder a recursos distintos del protocolo HTTP (como POP3 y SMTP para enviar y recibir correos electrónicos), necesita una puerta de enlace. Un programa CGI es una buena manera de implementar una puerta de enlace.
Algunas puertas de enlace de uso común se proporcionan en muchos servidores HTTP UNIX, como finger, wais, archie, etc. Pero en OmniHTTPD, estas puertas de enlace no se proporcionan. Pero podemos agregar funcionalidad de puerta de enlace a OmniHTTPD escribiendo programas CGI.
Formularios y su procesamiento.
Los formularios HTML son parte de documentos WEB y se utilizan para enviar información completada por los usuarios al servidor. Por lo general, esta información se pasa al programa CGI, que realiza una serie de operaciones o procesamiento de datos en función de la información de entrada, y luego genera un documento HTML que representa los resultados del procesamiento y lo envía de regreso al navegador del cliente.
Se puede ver que la parte clave de un programa CGI es obtener datos de entrada y generar documentos HTML, mientras que las partes de operación y procesamiento de datos son las mismas que la mayoría de las aplicaciones. En esta conferencia, presentaré cómo obtener datos y generar documentos HTML en Perl y Delphi.
Primero, creamos un documento HTML llamado saludo.html:
Archivo Greeting.html (almacenado en el directorio HtDocs de OmniHTTPD)
<html>
<cabeza>
<title>¡Esta es una página de saludo!</title>
< h1> Saludo </ /h1>
<cuerpo>
<hora>
<formulario action="/cgi-bin/greeting.pl" método=POST>
< p> Su nombre: < input type=text name="firstname" size=60 maxlength=80> < /p>
< p> Su apellido: < input type=text name="lastname" size=60 maxlength=80> < /p>
<hora>
< p> < tipo de entrada=valor de envío="¡Todo OK!"> < tipo de entrada=valor de restablecimiento="Borrar todo"> </ /p>
< /formulario>
< /cuerpo>
< /html>
Aquí está el programa Perl CGI Greeting.pl:
Archivo Greeting.pl (almacenado en el directorio cgi-bin de OmniHTTPD) # ¡Saludos!
requiere "cgi-lib.pl";
# =====================================
# obtener valores de entrada
&ReadParse(*entrada);
$mFirstName = $entrada{'firstname'};
$mApellido = $entrada{'apellido'};
# =====================================
# hacer algunas operaciones aquí
$mFullName = "$mFirstName $mLastName";
# =====================================
# crear un documento HTML para generar
Imprimir e imprimir encabezado;
print "< html>< head>< title> ¡Saludos! </ /title>< /head> ";
print "< cuerpo> Hola, < i>$mNombreCompleto< /i> ! ";
imprimir "< hr> por Greeting.pl < /body>< /html>";
# =====================================
# ¡Todo listo!
Pruebe el programa CGI navegando por http://localhost/greeting.html.
En el programa Perl anterior, como programa CGI, debe utilizar require "cgi-lib.pl" para hacer referencia al archivo cgi-lib.pl. Este archivo tiene muchas funciones y procedimientos para la programación CGI. require es equivalente a #include en C, pero cabe señalar que debe haber un punto y coma después de la declaración require.
El proceso ReadParse lee los datos enviados por el formulario HTML y el parámetro es un puntero de matriz. Cabe señalar que en Perl, las llamadas a funciones y procedimientos deben ir precedidas del símbolo &.
mFirstName, mLastName y mFullName son variables. En Perl, los nombres de las variables deben ir precedidos del signo $.
El valor de retorno real de la función PrintHeader es "Tipo de contenido: texto/html", que le indica al navegador que los siguientes datos son un documento HTML.
Generar el documento HTML es muy simple, simplemente use la declaración de impresión para generar el contenido del documento HTML. ¿Qué tal? ¿Puedes usar Perl para escribir programas CGI?
A continuación, escribamos un programa Delphi para realizar la misma función:
Primero cierre todos los proyectos en Delphi, seleccione el menú Archivo/Nuevo, seleccione el tipo de aplicación de servidor web en el cuadro de diálogo y use la opción ejecutable CGI independiente. Aparecerá un nuevo proyecto con el nombre de la ventana principal WebModule1.
Haga doble clic con el mouse en la propiedad Acciones de WebModule1 y aparecerá la ventana de edición de propiedades Acciones. Cree una nueva Acción en la ventana, denominada WebActionItem1, establezca su propiedad Predeterminada en Verdadero y haga doble clic en el evento OnAction en sus Eventos, agregue el siguiente código:
procedimiento TWebModule1.WebModule1WebActionItem1Action(Remitente: TObject;Solicitud: TWebRequest; Respuesta: TWebResponse; var manejada: booleana);
var
mFirstName, mLastName, mFullName: cadena;
HTMLDoc: cadena;
comenzar
// Obtener valores de entrada:
mFirstName := Request.ContentFields.Values['primer nombre'];
mApellido := Request.ContentFields.Values['apellido'];
//Hacer algunas operaciones aquí
mNombreCompleto := mNombre + ' ' + mApellido;
// Crear documento HTML para generar
HtmlDoc := '< html>< head>< title> ¡Saludos </ /title>< /head>';
HtmlDoc := HtmlDoc + '< cuerpo> Hola, < i>' + mFullName + '< /i> !';
HtmlDoc := HtmlDoc + '< hr> por Greeting.cgi < /body>< /html>';
Respuesta.Contenido := HtmlDoc;
fin;
Guarde la unidad de este proyecto como cgimain.pas y el proyecto como Greeting.dpr. Después de compilar (usando Ctrl+F9), copie Greeting.exe al directorio cgi-bin de OmniHTTPD y cámbiele el nombre a Greeting.cgi. Al mismo tiempo, realice las siguientes modificaciones al saludo.html que escribimos anteriormente:
Cambie <formulario action="/cgi-bin/greeting.pl" método=POST> a
<formulario acción="/cgi-bin/saludo.cgi" método=POST>
De esta manera, puede probar programas CGI escritos en Delphi navegando por http://localhost/greeting.html.
Como se puede ver en este programa, en Delphi, el evento OnAction de WebActionItem ocurre tan pronto como el programa CGI recibe una solicitud. En este caso, la entrada de datos y la generación de documentos HTML se realizan así:
Obtenga el valor del elemento de formulario a través de Request.ContentFields.Values[nombre del elemento de formulario HTML].
Genere documentos HTML asignando un valor a Response.Content.
El siguiente es el contenido de los tres archivos del programa Delphi: ------------------------------------ ---- -------------------
saludo.dpr:
saludo del programa;
{$CONSOLA TIPO APLICACIÓN}
usos
aplicación HTTP,
aplicación CGI,
cgimain en 'cgimain.pas' {WebModule1: TWebModule};
{$Ecgi}
{$R*.RES}
comenzar
Aplicación.Inicializar;
Aplicación.CreateForm(TWebModule1, WebModule1);
Aplicación.Ejecutar;
fin.
-------------------------------------------------- ----------
cgimain.pas:
unidad cgimain;
interfaz
utiliza Windows, Mensajes, SysUtils, Clases, HTTPApp;
tipo
TWebModule1 = clase(TWebModule)
procedimiento WebModule1WebActionItem1Action(Remitente: TObject;Solicitud: TWebRequest; Respuesta: TWebResponse; var manejada: booleana);
privado
{Declaraciones privadas}
público
{Declaraciones públicas}
fin;
var
WebModule1: TWebModule1;
implementación
{$R *.DFM}
procedimiento TWebModule1.WebModule1WebActionItem1Action(Remitente: TObject; Solicitud: TWebRequest; Respuesta: TWebResponse; var manejada: booleana);
var
mFirstName, mLastName, mFullName: cadena;
HTMLDoc: cadena;
comenzar
// Obtener valores de entrada:
mFirstName := Request.ContentFields.Values['primer nombre'];
mApellido := Request.ContentFields.Values['apellido'];
//Hacer algunas operaciones aquí
mNombreCompleto := mNombre + ' ' + mApellido;
// Crear documento HTML para generar
HtmlDoc := '< html>< head>< title> ¡Saludos </ /title>< /head>';
HtmlDoc := HtmlDoc + '< cuerpo> Hola, < i>' + mFullName + '< /i> !';
HtmlDoc := HtmlDoc + '< hr> por Greeting.cgi < /body>< /html>';
Respuesta.Contenido := HtmlDoc;
fin;
fin.
-------------------------------------------------- ----------
cgimain.dfm:
objeto WebModule1: TWebModule1
OldCreateOrder = Falso
Acciones = <
artículo
Predeterminado=Verdadero
Nombre = 'WebActionItem1'
OnAction = WebModule1WebActionItem1Acción
fin>
Izquierda = 192
Arriba = 107
Altura = 150
Ancho = 215
fin