Ir al contenido principal

Web service (.Net v/s Delphi 7)

Hace poco tuvimos que rompernos las cabeza viendo como comunicar una aplicación Delphi con un Web Service desarrollado en .Net

Lo primero es indicar a nuestra aplicación delphi la referencia hacia el web service:

1) El primer paso en el consumo (uso) de webservices es la creación del Proxy, para esto debemos ir al menú File->New-Other... y selecciónar el tab de "WebServices"
2) Una vez en esta ventana debemos seleccionar WSDLImporter para así empezar a crear nuestro proxy usando el wizard.
3) En este primer paso de creación del proxy para consumir nuestro Webservice debemos ingresar la URL en "Location of WSDL File o URL".
4) Esta primera parte del proceso genera una interfáz con los métodos, propiedades y atributos del webservice tal como se muestra en la siguiente imagen.
5) El último paso del wizard de creación del proxy para consumir nuestro Webservice es la generación del código de una interfáz que nos permitirá su uso en forma natural, ocultando todo el proceso de llamadas HTTP y SOAP correspondientes al proceso de comunicación con el servidor que aloja nuestro componente.
6) El código

A continuación se discuten las líneas de código que permiten la llamada al servicio web.

Las lineas siguientes permiten hacer uso de la unit que fué generada con el WSDLImporter, logrando el acceso a los métodos del servicio.

uses MailServices;
{$R *.dfm}


A continuación se declara una variable de tipo MailServicesPortType, que es la interfáz o proxy generado por el WSDLImporter, se declara además una variable de tipo string' para almacenar el resultado de la llamada al método de Autenticación.

procedure TForm1.Button1Click(Sender: TObject);
var
//Proxy de servicios de mail
mailService : MailServicesPortType;
//cadena de resultado
resultado : string;
begin


Para inicializar el proxy se debe hacer la llamada a GetMailServicesPortType(), método que posee sobrecarga de operadores, perimitiendo cambiar la URL original el servicio, sin tener que volver a ejecutar el WSDLImporter.

Una vez instanciada la variable de servicio, se pueden hacer las llamadas a los métodos en forma totalmente transparente, como por ejemplo al llamar al método Authenticate().

begin
try
mailService := GetMailServicesPortType();
resultado := mailService.Authenticate( EditEmail.Text,
EditPassword.Text);
MessageDlg( 'Resultado: ' + resultado ,
mtError, [mbOk],0);
except
on e:Exception do
begin
MessageDlg( e.Message, mtError, [mbOk],0);
end
end
end;


Siguiendo este mismo procedimiento, se pueden hacer las llamadas a los otros métodos expuestos por el servicio sin necesidad de tener que operar con SOAP, XML y HTTP como se mencionó anteriormente.

Nota: En caso de que cambie la firma de algún método o que se agreguen o remuevan métodos, no es necesario volver a crear el proxy para consumir el servicio.

Acceso a servicios protegidos

En muchas ocaciones no encontraremos con servicios protegidos con usuario y contraseña para poder hacer uso de ellos.

En estos casos es necesario modificar el proxy para enviar el usuario y la password en el objeto de acceso HTTP.

A continuación se muestra el código base de un proxy creado por Delphi 7 y las líneas que son necesarias para agregar mecanismos de autentificación antes de consumir el servicio, comúnmente creadas en el método GetXXXPortType.

const
defWSDL = 'http://midominio/MailServices.php?wsdl';
defURL = 'http://midominio/MailServices.php';
defSvc = 'MailServices';
defPrt = 'MailServicesPort';
var
RIO: THTTPRIO;
begin
Result := nil;
if (Addr = ) then
begin
if UseWSDL then
Addr := defWSDL
else
Addr := defURL;
end;
if HTTPRIO = nil then
RIO := THTTPRIO.Create(nil)
else
RIO := HTTPRIO;
...

Para agregar el usuario y la password de acceso al directorio se deben agregar las siguientes líneas

RIO.HTTPWebNode.UserName := 'usuario';
RIO.HTTPWebNode.Password := 'clave';

....
try
Result := (RIO as MailServicesPortType);
if UseWSDL then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
...


No olvidar incluir esta línea:

InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap),ioDocument);

Comentarios

Anónimo dijo…
Hola , y como se puede llamar a estos WS desde a pagina en ASP.
Graicas
Pistol dijo…
Lo desconozco Anónimo amigo, hace ya mucho que no programo en ASP.
Unknown dijo…
POR CASUALIDAD EL ERROR "Access violation at address XXXXXXX. write of address XXXXXXXX" puede ser por que no tengo permisos, ya tengo los metodos del webService pero cuando intento usarlos aparece el error??
Pistol dijo…
¿Has probado descartar que no sea un problema del web service?
¿Si colocas la URL del web service en tu navegador, se despliega la información de los métodos?

Entradas más populares de este blog

Notas Rápidas en Windows 7

ShortCuts Negrita = Ctrl + B Cursiva = Ctrl + I Texto subrayado = Ctrl + U Tachado = Ctrl + T Lista con viñetas = Ctrl + Mayús + L (ejecutarlo varias veces cambia el estilo) Mayor tamaño de texto = Ctrl + Mayús + , (coma) Menor tamaño de texto = Ctrl + Mayús + . (punto) Alinear texto a la derecha = Ctrl + R Alinear texto a la izquierda = Ctrl + L Cambiar a mayusculas el texto = Ctrl + Mayús + A Espacio entre parrafos = Ctrl + 1, Ctrl + 2 y Ctrl + 5 Crear nueva nota = Ctrl + N Eliminar nota seleccionada = Ctrl + D Seleccionar texto = Ctrl + A Cambiar de nota = Ctrl + Tab