| Herramientas Web. Investigación
en Internet Equipo Nº 2 - Tema: INTRANET |
| Página Original: http://www.ctv.es/USERS/pagullo/arti/d3_inet1/d3_inet1.htm |
|
Aplicaciones de servidor Internet/Intranet con Delphi 3.0 (I) por Pedro Agulló Soliveres Publicado en Revista Profesional para Programadores (RPP) |
| Con el enorme incremento de popularidad de Internet ha surgido una demanda cada vez mayor de servicios más sofisticados basados en la red de redes, más allá de la simple visualización del contenido de páginas HTML. Las aplicaciones de servidor Web son programas que vienen a cubrir este hueco: estas aplicaciones corren en un servidor remoto, y ofrecen servicios especializados tales como consultas sobre bases de datos remotas, etc. a cualquier persona que disponga de un navegador. |
Aplicaciones de Servidor Web
Internet se ha convertido en una red de alcance mundial en la que se puede encontrar y publicar todo tipo de información. Aunque el formato de la información utilizada para las páginas existentes en la red (HTML) permite mostrar gráficos, enlazar unas páginas con otras, etc., la interacción con el consumidor de dicha información está muy limitada. Con el tiempo, se han desarrollado una serie de especificaciones (CGI, WinCGI, ISAPI, etc.), que permiten crear programas situados en el servidor (aplicaciones de servidor en adelante), capaces de ofrecer servicios sofisticados a cualquier persona que disponga de un navegador. Tales servicios pueden ser tan simples como pedir una clave a un usuario antes de permitirle acceso a un área restringida, o tan complejos como los que proporciona cualquier aplicación convencional.
A lo largo de este artículo se estudiará la elaboración de aplicaciones de servidor con Delphi 3.0, junto con toda la información necesaria para llevar a cabo esta tarea: configuración de un servidor Web, creación de páginas HTML, etc.
Interacción entre navegador, servidor y aplicaciones de servidor
El acceso a la información disponible en los diversos servidores conectados a la red (ordenadores que proporcionan o sirven información) se obtiene mediante programas navegadores, como Internet Explorer o Netscape Communicator. El acceso a un servidor se controla y gestiona mediante un programa ubicado en el mismo que se conoce como servidor Internet o servidor Web: éste controla los permisos de acceso, la ubicación física de los diversos recursos (gráficos, páginas HTML, programas de servidor), etc. Algunos de los servidores más conocidos son WebSite, de O’Reilly & Associates, Internet Information Server (IIS), de Microsoft, FastTrack, de Netscape, etc.
Cuando utilizamos nuestro navegador para acceder a una página web, es el servidor Internet el que se encarga de localizar la información y enviárnosla: sin embargo, si necesitamos algún servicio especializado que el servidor no puede proporcionar directamente, es posible crear una aplicación de servidor que se encargue de proporcionarnos dicho servicio, aplicación que lógicamente estará ubicada en el mismo servidor. En ese caso, cuando el usuario trate de acceder a este servicio a través de un navegador, el servidor Internet recibirá la petición y le pasará la información sobre la misma a nuestro programa: éste la tratará y le devolverá la información solicitada al servidor Internet, el cuál por último enviará la respuesta de vuelta a nuestro navegador (Figura A).
![]()
Figura A: Interacción entre un navegador, un servidor Web, y una aplicación de servidor. Una característica importante de las aplicaciones de servidor es que, dado que los navegadores trabajan con páginas que están en formato HTML, deben devolver la información requerida en dicho formato, lo que hace que la programación de estas aplicaciones sea un tanto peculiar.
Por otro lado, al ser HTML un estándar que todos los navegadores entienden, es posible que un navegador trabajando bajo Unix, Windows, Mac o cualquier otro Sistema Operativo pueda interactuar con una misma aplicación de servidor, que puede estar ejecutándose bajo cualquier otro sistema. Dicho de otro modo, podemos conseguir soporte multiplataforma para nuestras aplicaciones con un coste de mantenimiento mínimo, dado que las máquinas cliente (nuestra máquina, por ejemplo), no necesitan ninguna configuración, excepto la existencia de un navegador, con lo que el único software que requiere mantenimiento es el programa en el servidor. Vale la pena señalar que este esquema de funcionamiento también es válido dentro de una red privada (intranet), con todas sus ventajas.
Los estándares: CGI, WinCGI, ISAPI y NSAPI
Como se vio más arriba, una aplicación de servidor Web obtiene la información del propio servidor, y luego le entrega la información resultante en formato HTML, para que se la envíe de vuelta al navegador que la pidió. La forma en que esta información se pasa de un lado a otro y cómo se ejecuta una aplicación de servidor por parte del servidor Web puede variar: hay varios estándares dedicados a resolver esta cuestión, incluyendo CGI, WinCGI, ISAPI, NSAPI, WSAPI y FastCGI.
CGI es la especificación más antigua, y en ella el servidor simplemente ejecuta la aplicación, que es un ejecutable normal (.EXE), en modo texto. Este modo de funcionamiento lleva a que la ejecución sea relativamente lenta, dado que debe cargarse el ejecutable cada vez que se recibe una petición. Lo mismo pasa con WinCGI, que es una especificación utilizada solo para las distintas versiones de Windows, y que se basa en la utilización de un archivo de configuración (.INI) para pasar información sobre la petición a la aplicación.
En cuanto a ISAPI (de Microsoft) y NSAPI (de Netscape), son especificaciones en las que la aplicación es en realidad una DLL a la que se le pasa la información necesaria: al tratarse de DLLS, estas pueden quedar cargadas en memoria, lo que lleva a un procesamiento más rápido de las peticiones. Tanto CGI como WinCGI, ISAPI y NSAPI están soportados directamente por Delphi 3.0.
Por lo que respecta a WSAPI (API del servidor WebSite) y FastCGI son estándares mucho menos difundidos, y no están soportados directamente por Delphi 3.0.
Aunque todas estas especificaciones difieren bastante a la hora de la implementación, a la hora de la verdad la información utilizada es básicamente la misma: esto ha permitido al equipo de desarrollo de Borland diseñar un soporte común para estas especificaciones, de modo que generar un programa de servidor CGI a partir de la versión del mismo para ISAPI es sorprendentemente sencillo. Tanto es así, que la DLL correspondiente a una aplicación de servidor para ISAPI y para NSAPI es la misma, sin requerir recompilación.
Dado que Delphi 3.0 proporciona un soporte para todas estas especificaciones excepcionalmente transparente, dejaremos de lado los detalles de cada especificación para estudiar el soporte común que Delphi 3.0 ofrece, lo que nos permitirá concentrarnos en los detalles fundamentales.
Preparando un servidor para ejecutar programas de servidor
Antes de abordar la creación de una aplicación de servidor, es necesario estudiar cómo configurar un servidor Internet, necesario para poder probar las aplicaciones de servidor que desarrollemos en nuestra propia máquina, sin necesidad de trabajar en red.
Una buena elección como servidor a utilizar en la fase de desarrollo es el Personal Web Server, de Microsoft, un servidor fácil de utilizar que además es gratuito: se puede obtener en Internet en las páginas de Microsoft, en http://www.microsoft.com. Para arrancarlo, bastará con ejecutarlo y en la página Startup del mismo escoger el botón Start (Figura B): a partir de este momento ya será posible realizar peticiones al servidor.
![]()
Figura B: Arranque del servidor Personal Web Server.
Como sabrán todos aquellos que hayan navegado alguna vez por Internet, una dirección http, necesaria para acceder a una página, tiene el formato http://www.xyz.es/paginas/pagina.htm. Aquí, www.xyz.es identifica un dominio, mientras que paginas es el directorio donde se encuentra la página HTML que deseamos ver, que es pagina.htm. Para desarrollo, utilizaremos como dominio localhost, o 127.0.0.1, que es la dirección IP que corresponde a dicho dominio. Este nombre de dominio y dirección IP sirve siempre para trabajar con un servidor instalado en la misma máquina en que desarrollamos, y es estándar: no importa el servidor Internet con que trabajemos, todos admitirán esta dirección.
Para poder trabajar correctamente será necesario especificar los directorios accesibles por un navegador mediante nuestro servidor. Para ello, se debe escoger la opción de menú Properties de Personal Web Server, y en la página Administration escoger el botón Administration, lo que nos llevará al administrador de configuración de Personal Web Server. Hecho esto, debemos ir a la página Directories (Figura C), y crear nuestro nuevo directorio, escogiendo la opción Add..., que nos permitirá añadir los diversos directorios, como se puede ver en la Figura D. Para los programas de ejemplo deberemos crear un directorio con el alias /DemoRpp, que en mi máquina está ubicado en h:\www\demorpp, aunque puede ser cualquier directorio de cualquier unidad de disco. A la hora de acceder a la página pagina.htm dentro de este directorio, deberemos escribir en nuestro navegador la dirección http://localhost/DemoRpp/pagina.htm, o http://127.0.0.1/DemoRpp/pagina.htm, que es equivalente.
![]()
Figura C: Administración de directorios con Personal Web Server.
Un detalle importante: para tener permiso para ejecutar aplicaciones de servidor ubicadas en un directorio, deberemos indicarlo explícitamente seleccionando la opción Execute del panel Access, como se puede ver en la Figura D. Por defecto, solo está seleccionada la opción Read, que solo da acceso para lectura de archivos (páginas HTML).
![]()
Figura D: Creación de un directorio accesible desde nuestro servidor local.
Una vez arrancado el servidor y configurado nuestro directorio de ejemplo, /DemoRpp, ya tenemos la máquina preparada para atender peticiones desde nuestro navegador, sin necesidad de estar conectado a ningún servidor que no sea nuestra propia máquina, que hará las veces de cliente y de servidor a la vez.
Para confirmar que la configuración ha sido llevada a cabo correctamente se puede hacer una prueba, arrancando un navegador y accediendo a http://localhost/DemoRpp/hola.dll, incluido en el diskette que acompaña a la revista.
Aplicación de servidor básica con Delphi 3.0
La aplicación hola.dll es la aplicación de servidor más pequeña posible: de hecho, no hace nada que no se pueda hacer directamente con una página HTML.
Para crear esta aplicación de servidor, se debe escoger la opción File|New... en el menú principal de Delphi: aparecerá un diálogo, en cuya página New deberemos escoger el icono con el título Web Server Application. Hecho esto, deberemos escoger la opción que deseemos, dependiendo de si queremos crear una aplicación CGI, ISAPI, etc: en nuestro caso, escogeremos la opción ISAPI/NSAPI Dynamic Link Library, dado que Personal Web Server soporta plenamente esta especificación. Delphi creará los archivos necesarios, incluyendo un WebModule, similar al DataModule que ya ofrecía Delphi 2.0. Aquí es donde situaremos los diversos componentes necesarios para construir la aplicación de servidor, aunque para este ejemplo no añadiremos ninguno.
![]()
Figura E: Creación de un item de acción en Delphi 3.0
A continuación, deberemos hacer click con el botón derecho del ratón sobre el WebModule, y escogeremos la opción Action editor... para introducir un item de acción (botón Add), que nos permitirá atender una petición: para ello, configuraremos sus propiedades tal y como se puede ver en la Figura E. Deberemos también escribir código asociado al evento OnAction de este item de acción, tal y como se puede ver en el Listado A, que será el que genere la información a devolver al navegador, es decir, una página HTML: en el Cuadro A se estudia el formato de una página HTML, algo que es imprescindible conocer para poder devolver información al navegador. Al evento OnAction siempre se le pasan dos objetos, Request, que contiene información sobre la petición, y Reponse, en el que devolveremos la respuesta a la misma.
Una página HTML es un archivo de texto normal y corriente, que siempre debe tener la siguiente estructura:
<HTML>
<HEADER>
<TITLE>Título de la página</TITLE>
</HEADER>
<BODY>
<!-- Aquí iría el contenido de la página -->
Hola
mundo
</BODY>
</HTML>
En el listado anterior el texto <HTML> marca el comienzo del documento HTML, mientras que </HTML> marca su final. Un documento HTML consta de una cabecera, en la que se incluye diversa información que no se muestra al usuario, y un cuerpo, que es donde se incluye la información a mostrar en el navegador. Todo el texto entre <HEADER> y </HEADER> forma parte de la cabecera, mientras que el cuerpo del documento está delimitado por <BODY> y </BODY>. Como se puede ver, cualquier comando HTML que se refiera a un área de texto, digamos el comando XXX, delimita la misma con una etiqueta <XXX> y otra </XXX>, diferenciadas solo por el carácter "/".
Una de las informaciones más importantes a incluir en la cabecera es el título de la página, que se escribe entre <TITLE> y </TITLE>. También es posible incluir comentarios en una página HTML, entre "<!--" y "-->", que no aparecerán en el navegador. Además, se puede poner tanto espacio en blanco como se desee, incluyendo líneas en blanco.
En el cuerpo de la página pueden incluirse numerosos comandos y texto suelto, que aparecerá tal cual. En el caso del listado anterior solo aparece el texto "Hola mundo", que era el único texto suelto existente en la página. Nótese que aunque en el listado "Hola" y "mundo" se encuentran en distintas líneas en el listado, en el navegador aparecerán como una única línea: los navegadores se saltan los espacios en blanco, los cambios de línea, etc. Si se desea forzar un salto de línea, se debe incluir el comando <BR>, o <P> para indicar un nuevo párrafo.
Para mostrar en itálica un texto se debe usar <I> e </I>, por ejemplo <I>Hola mundo</I>, mientras que para la negrita se usa <B> y </B>. Es posible crear encabezados con <H1> y </H1>, que muestran un texto más grande: para subencabezados más pequeños se puede utilizar desde <H2> a <H6>. También existen comandos para mostrar listas de elementos, con y sin numerar, tablas, imágenes (<IMG>, etc.
Muy importante es poder incluir un enlace a otras páginas: para poder saltar a una página situada en http://www.x.es/pag1.htm, por ejemplo, deberemos escribir <A HREF=http://www.x.es/pag1.htm>Púlsame</A>. En el navegador aparecerá el texto "Púlsame", y si se hace click con el ratón, el navegador intentará cargar dicha página
Cuadro A: Formato de una página HTML
Una vez que se haya escrito el código anterior, bastará compilar la aplicación (que debe estar guardada en el directorio correspondiente a /DemoRpp, en mi máquina h:\www\demorpp, para que el servidor pueda encontrarla y ejecutarla), y a continuación cargar un navegador y acceder a la dirección http://localhost/DemoRpp/hola.dll.
procedure TWebModule1.WebModule1TestAction(Sender:TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); begin // NOTA: #13#10 son los caracteres correspondientes // al salto de línea Response.Content := '<HTML>'#13#10 + '<HEADER>'#13#10 + ' <TITLE>Hola</TITLE>'#13#10 + '</HEADER>'#13#10 + '<BODY>'#13#10 + ' Hola, mundo'#13#10 + '</BODY>'#13#10 + '</HTML>'; end;Listado A: Código necesario para construir una página HTML con el mensaje "Hola mundo". Para comprender el significado del texto que se asigna a Response.Content, véase la Tabla A.
Antes de pasar a estudiar las clases que proporciona Delphi 3.0 vale la pena detenerse a estudiar en detalle cómo se lleva a cabo una petición dada. Como se puede imaginar, una aplicación puede atender a peticiones distintas: como es lógico, cada petición puede requerir que se le envíen una serie de argumentos conteniendo diversa información. ¿Cómo se realizan peticiones distintas a una misma aplicación de servidor, y cómo se le pasan los argumentos correspondientes? Un ejemplo dejará esto claro. Supongamos que deseamos que la aplicación hola.dll nos salude, y que deseamos pasarle nuestro nombre, de modo que el saludo esté personalizado. Para ello, se debería hacer la siguiente petición al browser:
http://localhost/hola.dll/saluda?nombre=Pedro&apellidos=Agulló
En este ejemplo, hola.dll es nuestra aplicación de servidor, saluda es la petición concreta que le queremos hacer (el equivalente a una función), y lo que sigue al carácter "?" son los argumentos de la petición (el equivalente a los argumentos de una función), en este caso se pasa como argumento nombre, con el valor "Pedro", y apellido, con el valor "Agulló". ¿Cómo recuperar esta información desde nuestra aplicación? Delphi proporciona un objeto con la información de la petición, Request: la propiedad Host de dicho objeto tendrá en este caso el valor "localhost", la propiedad ScriptName contendrá "hola.dll", "saluda" se encontrará en la propiedad PathInfo, y lo que sigue al carácter "?" en la propiedad Query. Se puede obtener el valor cada parámetro a través de la propiedad QueryFields, mediante QueryFields.Values[nombreParámetro]. El Listado B corresponde al evento OnAction del item de acción saluda, y muestra cómo se utilizan estas propiedades
Cuando nuestra aplicación de servidor hola.dll sea llamada, la petición será atendida por aquél item de acción cuya PathInfo sea saluda. En resumen, para cada petición distinta (función) que deseemos que proporcione nuestro programa deberemos crear un item de acción, y tratarla en su evento OnAction.
procedure TWebModule1.WebModule1SaludaAction( Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); Var nombre, apellidos : String; begin nombre := Request.QueryFields.Values[ 'nombre' ]; apellidos := Request.QueryFields.Values[ 'apellidos' ]; Response.Content := '<HTML>'#13#10 + '<HEADER>'#13#10 + ' <TITLE>Saludos</TITLE>'#13#10 + '</HEADER>'#13#10 + '<BODY>'#13#10 + ' <H1>¡Saludos!</H1>'#13#10 + ' ¿Qué tal, ' + nombre + ' ' + apellidos + '?<P>'#13#10 + ' <H2>Información sobre la petición:</H2>'#13#10 + ' Host = ' + Request.Host + '<BR>'#13#10 + ' ScriptName = ' + Request.ScriptName + '<BR>'#13#10 + ' PathInfo = ' + Request.PathInfo + '<BR>'#13#10 + ' Query = ' + Request.Query + '<BR>'#13#10 + '</BODY>'#13#10 + '</HTML>'; end;Listado B: Uso de ScriptName, etc.
En cuanto a la depuración de aplicaciones de servidor, para poder depurar hola.dll será necesario acceder a la opción Parameters del menú Run de Delphi, y especificar en Host Application el path de Personal Web Server (C:\Program Files\WebSvr\SYSTEM\Inetsw95.exe en mi sistema), y en Run Parameters el texto "-e w3svc". Al ejecutar el programa, con F9, Delphi cargará Personal Web Server: a partir de ahí, bastará con invocar la aplicación con http://localhost/DemoRpp/hola.dll para poder depurarlo.
El próximo mes
Este mes hemos estudiado cómo interacciona un navegador
con una aplicación de servidor, cómo configurar un servidor Internet para poder hacer uso de dichas aplicaciones, los distintos estándares existentes y la creación de aplicaciones básicas con Delphi 3.0, con una introducción al HTML necesario para poder devolver información al navegador.
El próximo mes estudiaremos con mayor detenimiento las diversas clases que proporciona Delphi, incluyendo las características de las peticiones de información y las respuestas. Asimismo, también se estudiará el acceso a bases de datos, el uso de formularios HTML, que permitirán interaccionar con los usuarios, el uso de cookies, e incluso las modificaciones necesarias al código de la librería de Delphi para soportar WinCGI bajo el servidor WebSite de O’Reilly & Associates.