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 interfáz.
Dichas funciones cuentan con dos parámetros de entrada A y B y un retorno, todos de tipo "double".
{ Invokable interface IwsDemo } unit wsDemoIntf; interface uses InvokeRegistry, Types, XSBuiltIns; type { Invokable interfaces must derive from IInvokable } IwsDemo = interface(IInvokable) ['{4C3D382F-31E7-4B42-B7DA-CB48311D7D71}'] { Methods of Invokable interface must not use the default } { calling convention; stdcall is recommended } function suma(const A,B: double): double; stdcall; function resta(const A,B: double): double; stdcall; function multiplicacion(const A,B: double): double; stdcall; function division(const A,B: double): double; stdcall; end; implementation initialization { Invokable interfaces must be registered } InvRegistry.RegisterInterface(TypeInfo(IwsDemo)); end.
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
{ Invokable implementation File for TwsDemo which implements IwsDemo } unit wsDemoImpl; interface uses InvokeRegistry, Types, XSBuiltIns, wsDemoIntf; type { TwsDemo } TwsDemo = class(TInvokableClass, IwsDemo) public function suma(const A,B: double): double; stdcall; function resta(const A,B: double): double; stdcall; function multiplicacion(const A,B: double): double; stdcall; function division(const A,B: double): double; stdcall; end; implementation { TwsDemo } function TwsDemo.suma(const A, B: double): double; begin end; function TwsDemo.resta(const A, B: double): double; begin end; function TwsDemo.multiplicacion(const A, B: double): double; begin end; function TwsDemo.division(const A, B: double): double; begin end; initialization { Invokable classes must be registered } InvRegistry.RegisterInvokableClass(TwsDemo); end.
Ahora, solo nos resta escribir el código de las funciones suma, resta, multiplicación y división.
function TwsDemo.suma(const A, B: double): double; begin result := A + B; end;
function TwsDemo.resta(const A, B: double): double; begin result := A - B; end;
function TwsDemo.multiplicacion(const A, B: double): double; begin result := A * B; end;
function TwsDemo.division(const A, B: double): double; begin result := A / B; end;
Nota: Si alguien se pregunta, que pasará con las excepciones generadas por el divisior cero, es parte del ejercicio, no es un bug
Fin Parte I