¿Cómo depurar un Servicio Web?

Índice

● Introducción
● Crear Aplicación SOAP Servidor
● Crear la aplicación Cliente
● Probando la depuración de nuestro Web Service
● Descargas


Introducción


 

Hace tiempo escribí dos pequeños tutoriales acerca de los Servicios Web, el primero Crear y consumir un WebService con Delphi (Parte I, II y III) y el segundo  Consumir WebService con acceso a Base de Datos.

Ahora he creado una tercera entrega a raíz de un hilo de mi amigo y colega Marc en los foros de la Comunidad DelphiAccess, donde preguntaba ¿Un WebService no puede usar Componentes no gráficos? , y durante las preguntas y respuestas, vi la necesidad de desarrollar un nuevo tutorial aprovechando la experiencia que he adquirido en la creación y consumo de Servicios Web y específicamente por la necesidad de contar con documentación de cómo depurar y encontrar de una forma «amable» problemas que no se pueden ver a simple vista.

Dado que éste tutorial no se centra en el desarrollo del Servicio Web, sino en como depurarlo, vamos a utilizar lo que ya vimos en el primer tutorial de ésta serie, usando las operaciones aritméticas básicas, Suma, Resta, Multiplicación y División y por tal razón me tomo el atrevimiento de hacer un «copy&paste» de dicho tutorial para enfocarnos en el tema de la depuración.

Éste tutorial fué desarrollado con XE3 pero puede realizarse con XE y XE2 también, para versiones anteriores a XE se desarrollará otro tutorial ya que se crea de forma diferente, en breve lo publicaré.

Como siempre, agradeceré todos los comentarios y críticas (en cualquier sentido) de éste tutorial.

regresar al Índice


Crear Aplicación SOAP Servidor


 

Comenzaremos creando nuestra Aplicación Servidor siguiendo los pasos que ya habíamos visto: File, New, Other, WebServices, seleccionamos SOAP Server Application y finalmente presionamos OK.

En Delphi XE2 y XE3 se mostrará una ventana donde elegiremos la opción Stand-Alone VCL application la cual es un servidor Web que es mostrado en una aplicación VCL y que utiliza el componente Indy HTTP Server. Presionamos el botón [Next>>] para continuar.

La versión XE de Delphi nos proporciona dos opciones para crear el depurador, en éste tutorial vamos a ver sólo la creación de una aplicación Stand Alone y elegiremos la opción Indy VCL Application, la otra opción llamada Web App Debuguer executable, la trataremos en un tutorial aparte ya que su funcionamiento es diferente y un poco más elaborado y es la que las versiones anteriores a XE traen por omisión.

La siguiente ventana nos preguntará que puerto queremos usar para que la aplicación Web escuche las peticiones del programa cliente, cuenta con un botón [Test Port] para asegurarnos que el puerto seleccionado no esté en uso por otra aplicación. Si se desea se puede utilizar un puerto seguro HTTPS, para éste tutorial utilizaremos el puerto 8080. Para continuar presionamos el botón [Finish].

En esta parte ya podemos ver que Delphi nos creó una aplicación VCL con todo lo necesario para iniciar y detener el servicio Web y nos preguntará si queremos crear la interfaz del módulo SOAP, presionamos el botón [No] ya que vamos a aprovechar el código que se tiene del primer tutorial que realizamos (Si ya cuentas con un servicio web, utiliza las unidades de implementación y de interfáz; si no, al final encontrarás un enlace donde prodrás descargar el código de éste tutorial).

Con el clásico Copy&Paste, agregamos a nuestro proyecto las unidades del servicio Web que creamos en nuestro primer tutorial y copiamos específicamente las unidades de Interfaz y de Implementación, en éste caso wsServerIntf.pas y wsServerImpl.pas respectivamente.

Finalmente agregamos las unidades que copiamos a nuestro proyecto y estamos listos para ejecutar nuestro depurador, una vez en ejecución, podemos ver que tiene un botón para iniciar y otro para detener nuestro servicio Web, una caja de texto para asignar el puerto http que queremos utilizar en nuestro depurador y un botón que nos abrirá el explorador de internet para ver la estructura de nuestro servicio Web.

Presionamos el botón [Start] y es posible que Windows te pida autorización para desbloquear la aplicación, como lo muestro en la siguiente imagen, presiona el botón [Permitir acceso] para continuar.

Una vez que hemos permitido el acceso a nuestra aplicación, presionamos el botón [Open Browser] e inmediatamente nos mostrará la página de información de nuestro Servicio Web. Damos clic en el enlace al WSDL del tipo de puerto IwsServer como se muestra en la siguiente imagen y como preparación de nuestro siguiente capítulo Crear la aplicación Cliente

regresar al Indice


Crear la aplicación Cliente


 

Después de dar clic al enlace WSDL, veremos una página con la definición de los métodos de nuestro servicio Web, seleccionamos la url de la página y la copiamos para utilizarla en la creación de la aplicación cliente que consumirá nuestro sevicios Web.

Abrimos otra instancia de Delphi para crear la aplicación cliente y creamos un nuevo proyecto VCL, posteriormente importamos el WSDL y para ello damos clic en File –> New –> Other –> WebServices –> WSDL Importer, éste «asistente» importa el documento WSDL y genera todas las definiciones de clases necesarias para llamar los servicios Web usando un objeto de interfaz remota llamado THTTPRIO. Presionamos el botón [OK] para continuar.

La siguiente pantalla no permitirá especificar la dirección URL donde está publicado el documento WSDL, como ya tenemos la ubicación del WSDL en el portapapeles, sólo pegamos la URL copiada. También nos permite especificar los datos de autenticación para acceder al documento WSDL, como son, Usuario, Contraseña y Proxy si tuviese. Para continuar presionamos el botón [Next>>].

La siguiente pantalla nos permitirá seleccionar la versión SOAP que es usada por el documento WSDL, ésta puede ser 1.1 o 1.2, pero también podemos permitir que se seleccione la versión automáticamente. Para prevenir un error porque la versión no coincida, se recomienda elegir la opción Automatic SOAP versioning

Finalmente se nos muestra la pantalla de Opciones de importación del WSDL, donde se podrá configurar la forma como el «asistente» generará el código para representar las definiciones del documento WSDL, por lo general, se debe de utilizar las opciones que por defecto están seleccionadas, ya que dichos valores proporcionarán la forma más segura de importar documentos WSDL. Para terminar el asistente presionamos el botón [Finish]

Ya tenemos la clase que nos permitirá consumir los métodos de nuestro servicios Web. Ahora sólo nos queda crear la interfaz de usuario, para no aburrirlos sólo les mostraré la aplicación después de agregar los componentes necesarios (Si desean ver el detalle pueden leer la sección correspondiente del primer tutorial de ésta serie donde se muestra el paso a paso). De cualquier forma, al final de éste tutorial podrán acceder al código fuente de todo el ejercicio.

A continuación les muestro el código para cada método del servicio Web, es realmente simple.

 

 
unit Unit1;

interface

uses
  Vcl.Forms, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Controls,
  System.SysUtils, System.Classes,
  IwsServer2;

type
  TForm1 = class(TForm)
    btnSuma: TButton;
    btnResta: TButton;
    btnMultiplica: TButton;
    btnDivide: TButton;
    leValor1: TLabeledEdit;
    leValor2: TLabeledEdit;
    btnCerrar: TButton;
    leResultado: TLabeledEdit;
    procedure btnSumaClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btnRestaClick(Sender: TObject);
    procedure btnMultiplicaClick(Sender: TObject);
    procedure btnDivideClick(Sender: TObject);
    procedure btnCerrarClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Server: IwsServer;

implementation

{$R *.dfm}

procedure TForm1.btnSumaClick(Sender: TObject);
begin
  leResultado.Text := format('%f',[Server.Suma(strtofloat(leValor1.Text),
                                           strtofloat(leValor2.Text))]) ;
end;

procedure TForm1.btnRestaClick(Sender: TObject);
begin
  leResultado.Text := format('%f',[Server.Resta(strtofloat(leValor1.Text),
                                            strtofloat(leValor2.Text))]) ;
end;

procedure TForm1.btnMultiplicaClick(Sender: TObject);
begin
  leResultado.Text := format('%f',[Server.Multiplica(strtofloat(leValor1.Text),
                                                  strtofloat(leValor2.Text))]);
end;

procedure TForm1.btnDivideClick(Sender: TObject);
begin
  leResultado.Text := format('%f',[Server.Divide(strtofloat(leValor1.Text),
                                              strtofloat(leValor2.Text))]);
end;

procedure TForm1.btnCerrarClick(Sender: TObject);
begin
  close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Server := GetIwsServer();
end;

end.

regresar al Índice


Probando la depuración de nuestro Web Service


 

Ya tenemos nuestro proyecto terminado, Servidor y Cliente, ahora sólo nos resta probar que realmente funciona. Para ello, abrimos nuestro proyecto «Server» y agregamos «BreakPoints» en los 4 métodos como se muestra en la siguiente imagen.

Antes de ejecutar nuestros proyectos, vamos a agregar unas líneas a la clase generada por el importador WSDL en nuestra aplicación cliente que en éste caso se llama IwsServer1.pas, dado que los servicios Web reciben las peticiones y su respuesta es de inmediato, es necesario agregar timeouts para que no se reciban errores por estar depurando nuestro servicio Web, basta con agregar tres lineas a dicha clase.

 

      RIO.HTTPWebNode.ConnectTimeout := 120000;
      RIO.HTTPWebNode.SendTimeout := 120000;
      RIO.HTTPWebNode.ReceiveTimeout := 120000;

 

Éstas líneas deben agregarse en la función GetIwsServer como se muestra en la siguiente imagen.

Ya podemos ejecutar nuestro servicio web en modo de depuración (F9) y nuestra aplicación Cliente sin depurador (Ctrl+Shift+F9).

Asignamos los valores a cada uno de los campos de edición y presionamos la operación que se desea depurar, en éste caso se ha presionado el botón de división y una vez que se ha presionado, el servicio Web es detenido en el método correspondiente, podemos entonces ir paso a paso por cada una de las líneas y ver qué es lo que se está ejecutando en cada una.

Con ésto hemos terminado éste sencillo ejercicio, espero que les proporcione las bases para poder crear sus propios depuradores de servicios Web.

regresar al Índice


Descargas


Si lo deseas puedes descargar el código fuente de éste tutorial, espero te sea de utilidad.

[download id=»1″]
[download id=»2″]


 

———-Éste tutorial y su código fuente son libres para su uso y publicación, lo único que te pido es mencionar la fuente.

 

Delphi y la WinRT

Hay un tema que se está propagando rápidamente en la comunidad acerca del uso de WinRT bajo el nuevo sistema operativo de Microsoft y que está próximo a liberarse.

Recupero el tema tal cual se presentó en una de las discusiones que suelen generarse dentro de los foros de Embarcadero y que Allen Bauer Embarcadero Chief Scientist responde a una pregunta directa de Brandon Staggs de la compañia StudyLamp Software LLC

Q.- Brandon Staggs
Is there any indication that Embarcadero wants to support native Metro development using the unmanaged API?

A. – Allen Bauer
Yes. We are very keen on supporting WinRT with native Delphi & C++ code. Right now, the issues surrounding the WinRT space center around the fact that many OS-supplied APIs which are required by anyone implementing their own language RTL are actually off-limits unless you’re the VC++ RTL DLL. You know, little things like RtlUnwind for exception processing and VirtualAlloc (et. al.) for memory management… Any calls to those APIs from your application will automatically disqualify your application from being an «official» WinRT application capable of delivering through the MS app store.

Right now the VC++ RTL DLL is given special dispensation since that is the library that makes the calls to those forbidden APIs and not directly from the user’s app. We’re currently rattling some cages at MS to find out how or if they’re going to allow third-party tools to target WinRT. Until we can get past that, targeting WinRT isn’t actually possible from a deliverable product sense. We are able to build WinRT applications with Delphi that work with a developer certificate, however they all fail the application qualification checks because of the aforementioned (an other) APIs.

Like the APIs I mentioned above, there are lots of changes with WinRT that make targeting it a little more tricky. For instance, you cannot merely open any file, access the registry, and even use the loopback (127.0.0.1) adaptor. LoadLibrary cannot be used to load any arbitrary DLL; you must call LoadPackageLibrary and only on a DLL that is present in the digitally signed appx package. WinRT is a seriously locked down sandbox or «walled-garden» with some extremely high walls.

This is a little known or understood «feature» of Windows 8. I see no press that even talks about this at all. IOW, it’s Windows 8’s «dirty little secret.»

Mi opinión es que MS no podrá sustentar su política restrictiva por mucho tiempo y finalmente tendrá que modificarla y/o ser menos cerrada como sucedió con el tema de su Visual Studio Xpress cuando quiso restringirlo a sólo aplicaciones Metro, Web, Azure y WinPhone. Finalmente tuvo que modificar su proyecto y permitir aplicaciones de escritorio y de linea de comandos, cosa que no les ha de haber gustado mucho.

Mientras tanto, sigamos trabajando con nuestra herramienta preferida, por supuesto, estoy hablando de Delphi 🙂

Seguimos en contacto.

The Embarcadero MVP Program

Como se publicó no sólo por ésta bitácora sino por varias más, se inició un programa conocido como «Embarcadero Evangelist Program» ahora éste programa cambia de nombre y oficialmente se llamará «The Embarcadero MVP Program».

Esto ha sido anunciado por Anders Ohlsson en su bitácora The Hacker’s Corner, por supuesto aún se está trabajando con la imagen del programa y con el diseño de una página de lanzamiento oficial del programa.

Se muestra una lista de los actuales miembros del programa y pronto crecerá con algunos compañeros que están en espera de ser confirmados.

Por último Anders Ohlsson abre la convocatoria para que la comunidad postule a más compañeros que son apasionados de las herramientas de Embarcadero y que deberían ser un MVP.

Sólo puedo decir que es un honor estar en la lista al lado de profesionales indiscutibles. 🙂

Seguimos en contacto.

EMBT Community Evangelist Program

MVP Embarcadero Program

Tengo el gusto de anunciar el nuevo programa de Embarcadero denominado «Embarcadero Community Evangelist» al cuál he sido invitado a participar.

Éste programa ha sido creado para motivar a miembros de la comunidad de desarrolladores que están involucrados y apasionados por las productos de Embarcadero y a su vez construir un vínculo más estrecho con la comunidad.

Puedo decir que éste es un programa muy interesante y novedoso ya que nos permitirá estar al día con las últimas versiones de los productos de Embarcadero y de esa forma poder transmitir nuestras experiencias, en nuestro caso, a la Comunidad Hispana.

Se que hay miembros muy valiosos que deberían estar en éste lugar y por lo mismo me siento honrado de pertenecer al aún pequeño grupo de compañeros que ya forman parte de éste programa, como lo son mis amigos Juan Antonio Castillo (jachguate), Salvador Jover (Delphi Básico) y Germán Estévez (Neftali) a quienes la mayoría ya conoce y de sobra por sus excelentes aportaciones a la comunidad.

Quiero agradecer a Allison DiLauro por su invitación. a Anders Ohlsson que me ha permitido ser parte de éste programa  y a Andreano Lanusse con quien conviví en todas las presentaciones que realizó en México desde el año 2007 y que me dieron certidumbre en los tiempos difíciles.

Solo me resta decir que tengo un gran reto por delante y espero pronto estar a la altura de las circunstancias.

Saludos y nos leemos pronto.

Gracias Andreano…….

Pues si, Andreano Lanusse dice adios a la comunidad Delphi, una noticia que me ha impactado por muchas cosas, entre ellas, la gran amistad que surgió en las multiples visitas que Andreano realizó a la Ciudad de México.

Además deja un vacío en las presentaciones de RAD Studio, recuerdo aquella primera presentación en México (2007) donde fuimos invitados varios compañeros a una comida con el distribuidor de México Gopac rpresentados por Raúl Gómez, Estela Rios y Norberto Martinez y Lisa Flores y Andreano Lanusse de, en ese entonces, Codegear.

A partir de entonces se hicieron costumbre y tuve el honor de estar presente en las charlas informales entre la comunidad y los representantes de nuestra querida herramienta, Andreano siempre atento a nuestros comentarios e inquietudes, Lisa Flores y después Allison DiLauro con su excelente disposición hacia la comunidad y ofreciendonos todo el apoyo,  Raúl Gómez, Francisco Miranda, Estela Rios, Alicia Mandujano y Alfonso Díaz de Gopac muy involucrados e interesados por la comunidad.

Andreano siempre ha sido un profesional y sé que triunfará en todo lo que emprenda. Son mis mejores deseos y espero que continúe regalandonos sus conocimientos.

Te mando un saludo y un abrazo fraternal desde la Ciudad de México, desde siempre tu casa y no olvides avisarme si es que vienes algún día nuevamente. Será un placer verte de nuevo.

Hasta siempre Andreano se te va a extrañar en las filas de Delphi.

Seguimos en contacto.