Autor Tema: Crear y consumir un WebService con Delphi (Parte I, II y III)  (Leído 13401 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Conectado egostar

  • Administrador
  • ******
  • Gracias
  • -Dados: 812
  • -Recibidos: 435
  • Mensajes: 8,119
  • Calificaciones: +488/-7
  • Sexo: Masculino
  • coding my life
    • MeXistemas punto com
Crear y consumir un WebService con Delphi (Parte I, II y III)
« en: 10 de Diciembre de 2008, 16:20:41 »
Crear la Aplicación Servidor:

Crear un nuevo proyecto

File, New, Other, WebServices, SOAP Server Application


En este caso práctico se ha decidido usar ISAPI/NSAPI Dynamic Link Library


Aceptamos crear la interfase del módulo SOAP


Agregamos un nuevo WebService y le asignamos un nombre en este ejemplo utilicé wsDemo y asignamos la generación de código que tiene por omisión.


Delphi nos creará las unidades correspondientes, veamos como se generó la interfase invocable de nuestro proyecto wsDemoIntf.pas


El siguiente paso es darle forma a las funciones que deseamos utilizar, usaremos operaciones aritméticas básicas (suma, resta, multiplicación y division) y se deben incluir dentro del cuerpo de nuestra interfase.

Las funciones cuentan con dos parámetros de entrada S y B y un parámetro de salida Resultado identificado con la palabra reservada OUT. Para llamar las funciones se recomienda que sean del tipo stdcall.


También se ha creado una unidad wsDemoImpl.pas para la implementación de la clase que será invocada, en la cual copiaremos las funciones creadas en la unidad wsDemoIntf.pas


Ahora, solo nos resta codificar las funciones de suma, resta, multiplicación y división.

Nota: Si alguien se pregunta, que pasará con las excepciones generadas por el divisior cero, es parte del ejercicio, no es un bug  :D



Fin Parte I
« última modificación: 18 de Diciembre de 2008, 15:56:13 por egostar »



"Si no quieres que la gente se olvide de ti apenas te mueras, escribe algo que valga la pena leerse o valga la pena escribirse."

- Benjamin Franklin


         

Conectado egostar

  • Administrador
  • ******
  • Gracias
  • -Dados: 812
  • -Recibidos: 435
  • Mensajes: 8,119
  • Calificaciones: +488/-7
  • Sexo: Masculino
  • coding my life
    • MeXistemas punto com
Crear y consumir un WebService con Delphi (Parte II)
« Respuesta #1 en: 10 de Diciembre de 2008, 16:22:14 »
Crear el directorio virtual de nuestro WebService:

Para realizar esto, ir al Panel de Control, Herramientas Administrativas y abrir el programa Internet Information Services, y crear un directorio virtual dentro de los Sitios Web, Sitio Web Predeterminado, clic derecho del mouse y seleccionar del menu contextual, Nuevo, Directorio Virtual.


Clic en Siguiente y asignamos un Alias a nuestro WebService:


Clic en Siguiente y seleccionamos el directorio que contiene nuestro WebService:


Asignamos los permisos a nuestro directorio virtual, (por omisión no trae seleccionado Ejecutar (ISAPI, CGI), habrá que seleccionarlo para que nuestro directorio funcione correctamente:


Clic en Finalizar y nuestro WebService está listo para ser llamado:


Al llamarlo desde cualquier explorador nos aseguramos que funcione correctamente nuestro WebService:



Fin Parte II
« última modificación: 10 de Diciembre de 2008, 16:39:39 por seoane »

"Si no quieres que la gente se olvide de ti apenas te mueras, escribe algo que valga la pena leerse o valga la pena escribirse."

- Benjamin Franklin


         

Conectado egostar

  • Administrador
  • ******
  • Gracias
  • -Dados: 812
  • -Recibidos: 435
  • Mensajes: 8,119
  • Calificaciones: +488/-7
  • Sexo: Masculino
  • coding my life
    • MeXistemas punto com
Crear y consumir un WebService con Delphi (Parte III)
« Respuesta #2 en: 10 de Diciembre de 2008, 16:23:00 »
Crear la aplicación cliente que consumirá nuestro WebService:

Creamos un nuevo proyecto (VCL Form Application).

Agregamos el WSDL a nuestro proyecto, File, New, Other, WebServices, WSDL Importer.


Clic en OK y nos mostrará una forma para incluir el URL de nuestro WSDL, para obtener esto podemos abrir nuestro WebServices con el explorador de Internet y clic en WSDL, como se muestra a continuación


La dirección que nos muestra es la que debemos de colocar en la ventana que lo solicita.



Clic en Finish y Delphi nos crea la unidad con la que vamos a poder consumir nuestro WebService.



Ahora solo nos resta generar las llamadas a las funciones, para ello incluimos en nuestro proyecto,

2 Componentes Edit para la captura de datos

1 Componente Label para el Resultado

4 Botones (Suma, Resta, Multiplicación y División)

3 Componentes Label para comentarios.

Nos quedaría algo así:


Ahora, agregamos en nuestro proyecto la unidad IwsDemo1 y generamos el código para cada uno de los botones:


Ejecutamos el proyecto y si todo nos quedo como lo soñamos  :D nos mostrará los resultados correspondientes a cada operación.

Suma:


Resta:


Multiplicación:


División:


Con eso hemos terminado nuestro ejemplo teórico/práctico, espero que les haya gustado tanto como a mi y sobre todo que sea de utilidad para futuras aplicaciónes donde se requiera de programación multicapa.

Ah, se me olvidaba, la división en cero nos dará una excepción que debemos de manejar, eso se los dejo de tarea :).

Salud OS

PD, Disfruten de todo lo que nos proporciona nuestra herramienta, siempre hay algo nuevo que aprender.
« última modificación: 10 de Diciembre de 2008, 16:40:02 por seoane »

"Si no quieres que la gente se olvide de ti apenas te mueras, escribe algo que valga la pena leerse o valga la pena escribirse."

- Benjamin Franklin


         

Desconectado felipe

  • Administrador
  • ******
  • Gracias
  • -Dados: 63
  • -Recibidos: 108
  • Mensajes: 2,678
  • Calificaciones: +119/-0
  • Sexo: Masculino
  • 100% producto colombiano
    • Web
Re: Crear y consumir un WenService con Delphi (Parte III)
« Respuesta #3 en: 10 de Diciembre de 2008, 16:30:35 »
Que tal Eliseo, algo que quieras corregir en el mensaje  *-)...  :p

Muy buen ejemplo, gracias...
Que Dios te tenga en su gloria amigo lKinGl...

Web - Twitter - Facebook

Conectado egostar

  • Administrador
  • ******
  • Gracias
  • -Dados: 812
  • -Recibidos: 435
  • Mensajes: 8,119
  • Calificaciones: +488/-7
  • Sexo: Masculino
  • coding my life
    • MeXistemas punto com
Re: Crear y consumir un WenService con Delphi (Parte III)
« Respuesta #4 en: 10 de Diciembre de 2008, 16:36:01 »
Que tal Eliseo, algo que quieras corregir en el mensaje  *-)...  :p

Muy buen ejemplo, gracias...

Gracias amigo, esto es una transcripción del tutorial publicado aquí

Salud OS

PD. Publicado con permiso del autor :p

Edito: Modifiqué la ruta de este artículo a la nueva bitácora :D
« última modificación: 10 de Febrero de 2009, 11:49:57 por egostar »

"Si no quieres que la gente se olvide de ti apenas te mueras, escribe algo que valga la pena leerse o valga la pena escribirse."

- Benjamin Franklin


         

Desconectado felipe

  • Administrador
  • ******
  • Gracias
  • -Dados: 63
  • -Recibidos: 108
  • Mensajes: 2,678
  • Calificaciones: +119/-0
  • Sexo: Masculino
  • 100% producto colombiano
    • Web
Re: Crear y consumir un WebService con Delphi (Parte III)
« Respuesta #5 en: 10 de Diciembre de 2008, 17:14:56 »
Claro Eliseo... son derechos de autor  :D
Que Dios te tenga en su gloria amigo lKinGl...

Web - Twitter - Facebook

Desconectado Caral

  • Administrador
  • ******
  • Gracias
  • -Dados: 195
  • -Recibidos: 258
  • Mensajes: 3,232
  • Calificaciones: +300/-4
  • Sexo: Masculino
  • Siempre Novato
Re: Crear y consumir un WebService con Delphi (Parte III)
« Respuesta #6 en: 10 de Diciembre de 2008, 17:26:48 »
Hola
Muy bueno amigo, lo voy a probar, se ve sencillo, claro esta muy bien explicado.
Saludos

Conectado egostar

  • Administrador
  • ******
  • Gracias
  • -Dados: 812
  • -Recibidos: 435
  • Mensajes: 8,119
  • Calificaciones: +488/-7
  • Sexo: Masculino
  • coding my life
    • MeXistemas punto com
Re: Crear y consumir un WebService con Delphi (Parte III)
« Respuesta #7 en: 10 de Diciembre de 2008, 17:32:23 »
Hola
Muy bueno amigo, lo voy a probar, se ve sencillo, claro esta muy bien explicado.
Saludos

Asi es amigo, es fácil, solo me falto acotar que esto lo hice en una maquina con Windows XP Profesional, parece que por ahi hay problemas con Vista....

Salud OS

"Si no quieres que la gente se olvide de ti apenas te mueras, escribe algo que valga la pena leerse o valga la pena escribirse."

- Benjamin Franklin


         

Conectado enecumene

  • Administrador
  • ******
  • Gracias
  • -Dados: 296
  • -Recibidos: 227
  • Mensajes: 5,092
  • Calificaciones: +285/-1
  • Sexo: Masculino
  • DA Webmaster
Re: Crear y consumir un WebService con Delphi (Parte III)
« Respuesta #8 en: 11 de Diciembre de 2008, 07:27:20 »
Excelente Eliseo (Y), pregunta, ¿en vez de usar IIS, puedo trabajar con Apache?.

Saludos.

Conectado egostar

  • Administrador
  • ******
  • Gracias
  • -Dados: 812
  • -Recibidos: 435
  • Mensajes: 8,119
  • Calificaciones: +488/-7
  • Sexo: Masculino
  • coding my life
    • MeXistemas punto com
Re: Crear y consumir un WebService con Delphi (Parte III)
« Respuesta #9 en: 11 de Diciembre de 2008, 09:39:29 »
Excelente Eliseo (Y), pregunta, ¿en vez de usar IIS, puedo trabajar con Apache?.

Saludos.

Pues no sabria decirte, no uso Apache, pero hasta donde entiendo deberia poderse,

¿Alguien en la sala usa Apache que nos pueda ilustar con este asunto?  *-)

Salud OS

"Si no quieres que la gente se olvide de ti apenas te mueras, escribe algo que valga la pena leerse o valga la pena escribirse."

- Benjamin Franklin


         

Desconectado axesys

  • Moderadores
  • ******
  • Gracias
  • -Dados: 106
  • -Recibidos: 44
  • Mensajes: 593
  • Calificaciones: +59/-0
  • Sexo: Masculino
  • Abelica
    • Axesys Estructuras de Informática
Re: Crear y consumir un WebService con Delphi (Parte I, II y III)
« Respuesta #10 en: 05 de Enero de 2009, 11:21:42 »
No saben como se puede consumir los webservices de un servidor Glassfish desde delphi 2009?
"Cualquier tonto puede escribir código que un ordenador entiende. Los buenos programadores escriben código que los humanos pueden entender"

Martin Fowler

Conectado egostar

  • Administrador
  • ******
  • Gracias
  • -Dados: 812
  • -Recibidos: 435
  • Mensajes: 8,119
  • Calificaciones: +488/-7
  • Sexo: Masculino
  • coding my life
    • MeXistemas punto com
Re: Crear y consumir un WebService con Delphi (Parte I, II y III)
« Respuesta #11 en: 05 de Enero de 2009, 11:28:47 »
No saben como se puede consumir los webservices de un servidor Glassfish desde delphi 2009?

Vaya, nunca lo habia escuchado, pero buscando vi esto

https://glassfish.dev.java.net/javaee5/ws-mgmt/wsmgmthome.html

Salud OS

"Si no quieres que la gente se olvide de ti apenas te mueras, escribe algo que valga la pena leerse o valga la pena escribirse."

- Benjamin Franklin


         

Desconectado axesys

  • Moderadores
  • ******
  • Gracias
  • -Dados: 106
  • -Recibidos: 44
  • Mensajes: 593
  • Calificaciones: +59/-0
  • Sexo: Masculino
  • Abelica
    • Axesys Estructuras de Informática
Re: Crear y consumir un WebService con Delphi (Parte I, II y III)
« Respuesta #12 en: 05 de Enero de 2009, 12:04:49 »
Crear los webservices en glassfish si lo puedo hacer. Estos webservices los puedo consumir desde java y .net sin problemas pero en delphi 2009 solo me consume los webservices sin parametros, en cambio cuando mando parametros es como si no mandara nada.

Alguien sabe como consumir los webservices de glassfish usando delphi 2009 con parametros?
"Cualquier tonto puede escribir código que un ordenador entiende. Los buenos programadores escriben código que los humanos pueden entender"

Martin Fowler

Conectado egostar

  • Administrador
  • ******
  • Gracias
  • -Dados: 812
  • -Recibidos: 435
  • Mensajes: 8,119
  • Calificaciones: +488/-7
  • Sexo: Masculino
  • coding my life
    • MeXistemas punto com
Re: Crear y consumir un WebService con Delphi (Parte I, II y III)
« Respuesta #13 en: 05 de Enero de 2009, 12:10:27 »
No le veo problema, deberia de funcionar con parámetros, ya hiciste un debug en tu aplicación para ver que es lo que envía y que es lo que recupera al y del webservices?

Salud OS

Edito: Puedes mostrarnos que es lo que te deja Delphi en el archivo Intf, me refiero a la interfaz invocable y sus funciones.

Salud OS

« última modificación: 05 de Enero de 2009, 12:12:12 por egostar »

"Si no quieres que la gente se olvide de ti apenas te mueras, escribe algo que valga la pena leerse o valga la pena escribirse."

- Benjamin Franklin


         

Desconectado axesys

  • Moderadores
  • ******
  • Gracias
  • -Dados: 106
  • -Recibidos: 44
  • Mensajes: 593
  • Calificaciones: +59/-0
  • Sexo: Masculino
  • Abelica
    • Axesys Estructuras de Informática
Re: Crear y consumir un WebService con Delphi (Parte I, II y III)
« Respuesta #14 en: 05 de Enero de 2009, 13:05:25 »
Este es el codigo que se genera a partir del wsdl
Código DELPHI
  1. unit Hola1;
  2.  
  3. interface
  4.  
  5. uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;
  6.  
  7. const
  8.   IS_OPTN = $0001;
  9.   IS_UNQL = $0008;
  10.  
  11.  
  12. type
  13.  Hola = interface(IInvokable)
  14.   ['{B73ACEDC-B21B-A805-777D-C86443A1C94A}']
  15.     function  hola(const arg0: string): string; stdcall;
  16.   end;
  17.  
  18. function GetHola(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): Hola;
  19.  
  20.  
  21. implementation
  22.   uses SysUtils;
  23.  
  24. function GetHola(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): Hola;
  25. const
  26.   defWSDL = 'http://localhost:8080/HolaService/Hola?wsdl';
  27.   defURL  = 'http://localhost:8080/HolaService/Hola';
  28.   defSvc  = 'HolaService';
  29.   defPrt  = 'HolaPort';
  30. var
  31.   RIO: THTTPRIO;
  32. begin
  33.   Result := nil;
  34.   if (Addr = '') then
  35.   begin
  36.     if UseWSDL then
  37.       Addr := defWSDL
  38.     else
  39.       Addr := defURL;
  40.   end;
  41.   if HTTPRIO = nil then
  42.     RIO := THTTPRIO.Create(nil)
  43.   else
  44.     RIO := HTTPRIO;
  45.   try
  46.     Result := (RIO as Hola);
  47.     if UseWSDL then
  48.     begin
  49.       RIO.WSDLLocation := Addr;
  50.       RIO.Service := defSvc;
  51.       RIO.Port := defPrt;
  52.     end else
  53.       RIO.URL := Addr;
  54.   finally
  55.     if (Result = nil) and (HTTPRIO = nil) then
  56.       RIO.Free;
  57.   end;
  58. end;
  59.  
  60.  
  61. initialization
  62.   InvRegistry.RegisterInterface(TypeInfo(Hola), 'http://hola/', 'UTF-8');
  63.   InvRegistry.RegisterDefaultSOAPAction(TypeInfo(Hola), '');
  64.   InvRegistry.RegisterInvokeOptions(TypeInfo(Hola), ioDocument);
  65.  
  66. end.

Y estos son los xml que se envian y reciben por el webservice

Código XML
  1. Request
  2.        
  3. <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SOAP-ENV:Header/><SOAP-ENV:Body><hola xmlns="http://hola/"><arg0>Daniel</arg0></hola></SOAP-ENV:Body></SOAP-ENV:Envelope>
  4.  
  5. Response
  6.  
  7. <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:holaResponse xmlns:ns2="http://hola/"><return>Hola: null</return></ns2:holaResponse></S:Body></S:Envelope>
  8.  
El código del webservice es

Código: [Seleccionar]
package hola;

import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService
@Stateless(name = "Hola")
public class Hola {

@WebMethod
public String hola(String param) {
return "Hola: " + param;
}

}

Me debería regresar "Hola: Daniel" pero regresa "Hola: null"
« última modificación: 05 de Enero de 2009, 13:07:08 por enecumene »
"Cualquier tonto puede escribir código que un ordenador entiende. Los buenos programadores escriben código que los humanos pueden entender"

Martin Fowler

Desconectado Héctor Randolph

  • Administrador
  • ******
  • Gracias
  • -Dados: 28
  • -Recibidos: 93
  • Mensajes: 486
  • Calificaciones: +105/-0
  • Sexo: Masculino
  • 501st Legion
Re: Crear y consumir un WebService con Delphi (Parte I, II y III)
« Respuesta #15 en: 05 de Enero de 2009, 15:37:54 »
Con respecto a utilizar Apache para los servicios web puedo comentar lo siguiente.

En las versiones 6 y 7 de Delphi, se daba soporte para crear servicios web como módulos de Apache, esto ocurría porque en aquel momento se trabajaba en paralelo con las versiones de Kylix, esto obligaba a dejar abierta una opción para generar los servicios en ambientes multiplataforma. Sin embargo, como sabemos este proyecto quedó suspendido y en las nuevas versiones de Delphi se tiene únicamente la opción de crear servicios web para Windows con la tecnología ISAPI/NSAPI (para Microsoft para IIS), o bien, como un ejecutable CGI.

Si tienes instalado Apache en Windows con soporte para CGI, Puedes crear desde Delphi un servicio web con la opción "CGI-Stand-alone executable". Este ejecutable lo debes colocar en la carpeta que Apache destina para los scripts CGI, le cambias la extensión de EXE a CGI y listo lo puedes utilizar desde el servidor web.

CGI no es la tecnología más recomendada para los servicios web, por cuestiones de rendimiento y seguridad. En este caso sería mejor utilizar ISAPI.

Por otra parte puedes instalar un módulo para ISAP en apache http://httpd.apache.org/docs/2.0/mod/mod_isapi.html, pero esto es un poquito más complicado.

Saludos



 

Conectado enecumene

  • Administrador
  • ******
  • Gracias
  • -Dados: 296
  • -Recibidos: 227
  • Mensajes: 5,092
  • Calificaciones: +285/-1
  • Sexo: Masculino
  • DA Webmaster
Re: Crear y consumir un WebService con Delphi (Parte I, II y III)
« Respuesta #16 en: 05 de Enero de 2009, 15:40:48 »
Muchas gracias Héctor, me ha sido claro y útil tus comentarios. (y).

Saludos.

Desconectado axesys

  • Moderadores
  • ******
  • Gracias
  • -Dados: 106
  • -Recibidos: 44
  • Mensajes: 593
  • Calificaciones: +59/-0
  • Sexo: Masculino
  • Abelica
    • Axesys Estructuras de Informática
Re: Crear y consumir un WebService con Delphi (Parte I, II y III)
« Respuesta #17 en: 05 de Enero de 2009, 19:10:09 »
Hice la prueba con un webservice de NetWeaver 7.1 y tambien pasa lo mismo que no reconoce el parametro

En cambio si llamo el webservice con Web Service Navigator de NetWeaver los xml enviados y recibidos son diferentes que los de delphi

Parámetros de entrada
Código: [Seleccionar]
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SOAP-ENV:Body>
    <yq1:hola xmlns:yq1="http://demo/">
      <arg0>Daniel</arg0>
    </yq1:hola>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Resultado
Código: [Seleccionar]
<?xml version="1.0" encoding="utf-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SOAP-ENV:Body>
    <ns2:holaResponse xmlns:ns2="http://demo/">
      <return>Hola: Daniel</return>
    </ns2:holaResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Alguien tiene idea de como solucionar esto para que funcione desde delphi tambien?
"Cualquier tonto puede escribir código que un ordenador entiende. Los buenos programadores escriben código que los humanos pueden entender"

Martin Fowler

Desconectado axesys

  • Moderadores
  • ******
  • Gracias
  • -Dados: 106
  • -Recibidos: 44
  • Mensajes: 593
  • Calificaciones: +59/-0
  • Sexo: Masculino
  • Abelica
    • Axesys Estructuras de Informática
Re: Crear y consumir un WebService con Delphi (Parte I, II y III)
« Respuesta #18 en: 05 de Enero de 2009, 19:28:19 »
Con el tester de GlassFish estos son los xml enviados y recibidos

SOAP Request

Código: [Seleccionar]
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header/>
<S:Body>
<ns2:hola xmlns:ns2="http://hola/">
<arg0>Daniel</arg0>
</ns2:hola>
</S:Body>
</S:Envelope>


SOAP Response
Código: [Seleccionar]
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:holaResponse xmlns:ns2="http://hola/">
<return>Hola: Daniel</return>
</ns2:holaResponse>
</S:Body>
</S:Envelope>
"Cualquier tonto puede escribir código que un ordenador entiende. Los buenos programadores escriben código que los humanos pueden entender"

Martin Fowler

Desconectado axesys

  • Moderadores
  • ******
  • Gracias
  • -Dados: 106
  • -Recibidos: 44
  • Mensajes: 593
  • Calificaciones: +59/-0
  • Sexo: Masculino
  • Abelica
    • Axesys Estructuras de Informática
Re: Crear y consumir un WebService con Delphi (Parte I, II y III)
« Respuesta #19 en: 07 de Enero de 2009, 20:10:14 »
Ya me funciono solo habia que cambiar esta linea InvRegistry.RegisterInvokeOptions(TypeInfo(Hola), ioDocument); por esta InvRegistry.RegisterInvokeOptions(TypeInfo(Hola), ioDefault); y ya me regresa correctamente "Hola: Daniel"
"Cualquier tonto puede escribir código que un ordenador entiende. Los buenos programadores escriben código que los humanos pueden entender"

Martin Fowler