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.
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.
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().
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.
Para agregar el usuario y la password de acceso al directorio se deben agregar las siguientes líneas
No olvidar incluir esta línea:
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
Graicas
¿Si colocas la URL del web service en tu navegador, se despliega la información de los métodos?