¿Cómo depurar un Servicio Web?

octubre 18, 2012 Por EliseoGN

Í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.