14 marzo 2008

Creando aplicaciones multicapa (y VII)

Voy a finalizar este artículo hablando sobre la creación de aplicaciones multicapa utilizando servicios web a través del protocolo SOAP.

Para ello voy a utilizar el servidor Apache para alojar el ejecutable de mi servidor de aplicaciones.

CREANDO EL SERVIDOR DE APLICACIONES

El servidor de aplicaciones va a ser un ejecutable CGI que vamos a situar en el directorio cgi-bin de Apache. Los pasos para su creación son los siguientes:

1. Selecciona File -> New -> Other. Seleccionamos la pestaña WebServices, elegimos SOAP Server application y pulsamos Ok:


Al pulsar Ok nos preguntará el tipo de servidor que vamos a crear:


2. Como quiero que mi servidor web sea un ejecutable independiente voy a seleccionar la segunda opción: CGI Stand-alone executable. Al pulsar Ok nos creará un proyecto nuevo que incluye el siguiente módulo de datos web:

3. Nos preguntará si deseamos crear una interfaz para el módulo SOAP. Pulsamos No.

4. Cuando pulsemos el botón Save All para guardar todo el proyecto, vamos a poner como nombre el objeto TWebModule1 como UServidorSOAP.pas y el nombre del proyecto como ServidorSoap.dpr. El proyecto creado sólo se compone de dos partes; por un lado el archivo DPR del proyecto:


Y una unidad de la clase TWebModule que es la encargada de recoger las peticiones de los clientes:


5. Ahora vamos a añadir un módulo de datos remoto: File -> New -> Other, pestaña WebServices, seleccionamos SOAP Server Data Module y pulsamos Ok.

6. Nos preguntará el nombre del módulo: ModuloSOAP y pulsamos Ok. Lo guardamos también como UModuloSOAP.pas.

7. En este módulo de datos insertamos los componentes de acceso a nuestra base de datos Firebird, al igual que hicimos en artículos anteriores:


8. Compilamos el proyecto y nos generará el archivo ServidorSoap.exe. Si ejecutamos ese archivo nos devuelve una página web con la descripción de nuestros servicios web disponibles. Puede verse abriendo una ventana de comandos y ejecutando:

ServidorSoap.exe > servicios.html

9. Copiamos el ejecutable ServidorSoap.exe al directorio cgi-bin donde tengamos instalado el servidor web Apache. Para comprobar que nuestro servidor de aplicaciones esta operativo, abrimos un navegador web y escribimos la siguiente dirección:

http://127.0.0.1/cgi-bin/ServidorSoap.exe

Nos mostrará la misma página web que hemos guardado en servicios.html:


Con esto ya tenemos creado nuestro servidor de aplicaciones.

CREANDO LA APLICACION CLIENTE

La aplicación cliente va a ser similar a todas las que hemos creado hasta ahora:


Como puede verse en la imagen, he incluido un componente de la clase TSoapConnection de la pestaña de componentes WebServices. Al componente lo he llamado ClienteSoap y he modificado las siguientes propiedades:

URL: http://127.0.0.1/cgi-bin/ServidorSoap.exe/SOAP/
SOAPServeIID: IAppServerSOAP - {C99F4735-D6D2-495C-8CA2-E53E5A439E61}
Connected: True

Y en el componente TClientes (ClientDataSet) modificamos:

RemoteServer: ClienteSOAP
ProviderName: DSPCliente
Active: True

Haciendo esto debe verse la lista de clientes.

Este es el tipo de aplicación multicapa que más me gusta, ya que al trabajar a través del puerto 80 y mediante XML-SOAP no es necesario abrir puertos en los routers ni en los cortafuegos de los antivirus.

Como hemos visto anteriormente al crear el servidor de aplicaciones, también pueden crearse servidores que estén dentro de una librería DLL ya sea para el servidor apache o para el servidor Internet Information Server (IIS) de Microsoft.

Pruebas realizadas con Delphi 7.0, Firebird 2.0 y Apache Server 2.2.8.

11 comentarios:

José Torres dijo...

Excelente! encontré tu blog hace pocos días, en la empresa necesitamos una solución para el acceso Web a bases Fb. Estamos avanzando gracias a tu ayuda, muchas gracias

Unknown dijo...

¡Hola de nuevo, mi estimado!

¡Muy bueno tu tutorial de aplicaciones multicapa!!! ¡Sigue así!!!

Te doy lata con algunas preguntas...

Marco histórico-tecnológico: Estoy construyendo un sitio web con PHP, Javascript y Webservices (estos últimos ya funcionan, más o menos). El host es linux (hosting pagado). Por el tiempo, que ya lo tengo encima, y por aprender más de Delphi (no por flojera, jeje) pensé enlazar una aplicación en Turbo Delphi al webservice.

¿Cómo enlazaría el ClientDataSet al webservice si no tengo un DataSetProvider?

¿O cómo realizaría la petición de otra forma para que me devolviera la información?

¿Me podrías recomendar alguna bibliografía o enlace donde pueda conseguir más información?

He buscado y no hay mucha información sobre webservices en PHP y clientes Delphi.

¡Gracias y saludos!

Administrador dijo...

No confundas las aplicaciones multicapa de Delphi con los servicios web.

Los servicios web son uno de los protocolos que utiliza la tecnología de aplicaciones multicapa de Delphi pero también utiliza HTTP Socks.

Para lo que tu quieres hacer necesias componentes relacionados con SOAP, que son precisamente para crear o distribuir servicios web. Y luego tienes que establecer un protocolo común a Delphi y PHP, es decir, definir bien los datos que va a transmitir tu servicio web.

Algún día investigaré sobre este interesante tema.

Saludos

RobertRevolver dijo...

Una pregunta referente a tu excelente tutorial de servicios multicapa:
El exe, del servidor SOAP, es necesario este alojado en un servidor con windows?
disculpa lo obvio que puede ser la pregunta, pero aun no capto como funciona realmente, ya hice todos los pasos, y funciono, pero quiero ir mas alla, saludos. y felicitaciones por tu altruismo al compartir tus conocimientos.

Administrador dijo...

Como es natural, el servidor de aplicaciones debe estar alojado en un servidor Windows porque también se ha realizado con Delphi.

Que utilice el protocolo SOAP para parsar la información entre el servidor y el cliente no significa que esta tecnología sea multiplataforma (más quisieramos algunos).

Ya no se si Kylix soportaba todo esto...

RobertRevolver dijo...

Hola, por aqui otra vez, he regresado a tu blog, y me a servido muchisimo tu articulo de aplicaciones multicapa con el servidor soap, me encuentro el detalle de que, ya construido tal como dices en tu articulo, cuando lo hago con interbase, si me guarda los cambios, pero cuando trato de hacerlo con mysql, nomas no me deja guardar cambios, estoy usando las librerioas zeoslib para mysql, podras darme algun norte de donde podra tener el error? saludos cordiales y de antemano mil gracias.

Administrador dijo...

Sólo he manejado los componentes Zeos para echarles un vistazo, pero supongo que puede ser que hayas cogido un componente de sólo lectura y que tengas que añadirse un componente de actualización (como ocurre con los TIBQuery).

Saludos.

RobertRevolver dijo...

Me da gusto saludarte, esta vez para comentarte que ya pude terminar de hacer pruebas con el servidor soap multicapa, encontre informacion de como aplicar updates, y ademas como pasar parametros desde el cliente al servidor, voy a documentar esa partecita y mandartela por si gustas adicionarlo a tu manual que esta muy bueno, aprendí muchas cosas en el, saludos cordiales.

Administrador dijo...

Me alegro de que lo hayas conseguido.

Saludos.

RobertRevolver dijo...

Una pregunta mas Sr.
Tu sabes Como podria dentro del modulo remoto de datos, poner un objeto cualquiera, para poder manipularlo desde la capa de presentación.

Oscar Benitez dijo...

Estos artículos están fabulosos, lástima que el autor ya no siguiera publicando más.

Publicidad