Ir al contenido


Foto

Consumir WebService con acceso a Base de Datos


  • Por favor identifícate para responder
76 respuestas en este tema

#61 darkerviti

darkerviti

    Member

  • Miembros
  • PipPip
  • 21 mensajes

Escrito 30 enero 2014 - 03:16

Muchisimas gracias, eres un crack.

Una preguntilla, he estado mirando y parece ser que es un problema con el Delphi 6, que el tema de la autenticacion está un tanto ... chungo.

¿Sabes alguna forma, va a estar en tu ejemplillo?

Muchas gracias.

Que tal darkerviti,

Lo que te puedo decir es que el usuarios y la contraseña deben ser parte de una clase que se llama TSOAPHeader y se deben enviar antes de llamar al método que quieres consumir.

Precisamente estoy desarrollando un ejemplo de éste tema, espero el fin de semana darme el tiempo para terminarlo y publicarlo.

Saludos


  • 0

#62 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.460 mensajes
  • LocationMéxico

Escrito 30 enero 2014 - 08:58

Muchisimas gracias, eres un crack.

Una preguntilla, he estado mirando y parece ser que es un problema con el Delphi 6, que el tema de la autenticacion está un tanto ... chungo.

¿Sabes alguna forma, va a estar en tu ejemplillo?

Muchas gracias.


A mi me parece que el problema con Delphi6 y algunas otras versiones es que utilizan la versión 1.1 de SOAP y actualmente se usa la versión 1.2 sobre todo los WebServices desarrollados con .NET que son los que normalmente presentan algunos detalles a la hora de importar su WSDL.

El ejemplo que pretendo mostrar es como agregar el encabezado con usuario y contraseña en el SOAP.

Saludos
  • 0

#63 darkerviti

darkerviti

    Member

  • Miembros
  • PipPip
  • 21 mensajes

Escrito 31 enero 2014 - 07:39

Buff, al final lo he conseguido, pongo un poco lo que he hecho para la parte del login:
Los tipos de datos:



delphi
  1.   ws : WSBDCASoap;
  2.   ws_res : ArrayofString;
  3.   cab_serv : Autenticacion;

     
Y esta es la conexión:



delphi
  1.             cab_serv:= Autenticacion.Create;
  2.             cab_serv.user := '*****';
  3.             cab_serv.pwd := '******';
  4.             ws := GetWSBDCASoap(True);
  5.             (ws as ISOAPHeaders).Send(cab_serv);
  6.             ws_res := ws.SubirArchivo(FIleToByteArray(nom_red + nom_fich + 'D.xml'), nom_red + nom_fich + 'D.xml');



En definitiva, al tutorial de como hacer la parte cliente le he tenido que agregar el todo código menos la última linea y con eso por fin he conseguido una respuesta del servidor.
Muchas gracias por la ayuda y de todas formas, quedo a la espera de ver tu solución, que seguro será cuanto menos, más elegante.
  • 0

#64 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.460 mensajes
  • LocationMéxico

Escrito 31 enero 2014 - 09:00

Buff, al final lo he conseguido, pongo un poco lo que he hecho para la parte del login:
Los tipos de datos:


En definitiva, al tutorial de como hacer la parte cliente le he tenido que agregar el todo código menos la última linea y con eso por fin he conseguido una respuesta del servidor.

Muchas gracias por la ayuda y de todas formas, quedo a la espera de ver tu solución, que seguro será cuanto menos, más elegante.


De hecho es esa la forma como se envía el usuario y la contraseña (y)

Saludos
  • 0

#65 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 08 marzo 2014 - 11:50

Buenas! Antes que nada es un excelente tutorial!!!!
He llegado hasta el paso del IIS, puse el CD de Windows y lo instale, pero el caso es que al acceder al localhost por el navegador me dice:

No se puede encontrar el módulo especificado.

Que podra ser? Muchas gracias...
  • 0

#66 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.460 mensajes
  • LocationMéxico

Escrito 08 marzo 2014 - 10:11

Buenas! Antes que nada es un excelente tutorial!!!!
He llegado hasta el paso del IIS, puse el CD de Windows y lo instale, pero el caso es que al acceder al localhost por el navegador me dice:

No se puede encontrar el módulo especificado.

Que podra ser? Muchas gracias...


Es algo respecto a la configuración del IIS, estoy asumiendo que tienes la versión 7 de IIS (Windows Seven, 2008, y mayores)

Ve éste excelente tutorial, seguro te ayudará

Saludos
  • 0

#67 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 09 marzo 2014 - 12:45

Bueno no te dije que tengo la version 5.1 de IIS, lo que hice fue ir al panel de control y agregue con el cd de windows xp el IIS que por defecto no viene instalado.
  • 0

#68 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 10 marzo 2014 - 04:10

Claro con razon las opciones que figuran en las capturas del tutorial que me pasaste no las encuentro en mi pc, sera por la version?

No se que otra cosa puede ser. de primero pense que estaba programando mal el webmodule yt que por eso me decia no se puede encontrar el modulo especificado, porque por lo que leo este tutorial es con windows xp no cierto?

Gracias igual.
  • 0

#69 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.460 mensajes
  • LocationMéxico

Escrito 10 marzo 2014 - 09:05

Claro con razon las opciones que figuran en las capturas del tutorial que me pasaste no las encuentro en mi pc, sera por la version?

No se que otra cosa puede ser. de primero pense que estaba programando mal el webmodule yt que por eso me decia no se puede encontrar el modulo especificado, porque por lo que leo este tutorial es con windows xp no cierto?

Gracias igual.


Así es, éste tutorial está desarrollado en XP, pero, sigue sin funcionar ???

Si puedes mostrarnos más detalles se te podría ayudar más.

Saludos
  • 0

#70 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 10 marzo 2014 - 10:09

Bueno para la base de datos, yo siempre use XAMPP y probe para este caso correr el servicio SQL, no se si se podra con mysql workbench, porque nunca use firebird.

Que datos debo poner en la conexion sql, EN MODIFY CONECCTION, dentro de mysql, hice click en new connection, puse localhost, y el nombre de la base de datos que tengo con xampp, que la hice en phpmyadmin, ejecutando el script, y los parametros de xampp, que son "root" y "".

En lo anterior puede haber un problema.

Otra cosa que pense es que se podria poner aqui como quedan las unidades completas, porque vos nos pasaste codigo que vayamos agregando y alo mejor lo coloque mal:

WSdbACCESSintf.pas:



delphi
  1. { Invokable interface IWSdbAccess }
  2.  
  3. unit WSdbAccessIntf;
  4.  
  5. interface
  6.  
  7. uses Soap.InvokeRegistry, System.Types, Soap.XSBuiltIns;
  8.  
  9. type
  10.  
  11.   { Invokable interfaces must derive from IInvokable }
  12.   IWSdbAccess = interface(IInvokable)
  13.   ['{F0DB3CA4-86B5-4C04-86B9-DE5967826E6F}']
  14.  
  15.     { Methods of Invokable interface must not use the default }
  16.     { calling convention; stdcall is recommended }
  17.   end;
  18. type
  19.  
  20.   trRetorno = class(TRemotable)
  21.     private
  22.       FID: integer;
  23.       FDescripcion: widestring;
  24.     published
  25.       property ID: integer read FID write FID;
  26.       property Descripcion: widestring read FDescripcion write FDescripcion;
  27.   end;
  28.  
  29.   trParams = class(TRemotable)
  30.     private
  31.       FTitulo: widestring;
  32.       FNombre: widestring;
  33.       FApellidos: widestring;
  34.       FFecha: widestring;
  35.       FDireccion: widestring;
  36.       FCiudad: wideString;
  37.       FPais: wideString;
  38.       FCodPostal: wideString;
  39.       FTelCasa: wideString;
  40.       FTelOficina: wideString;
  41.       FCelular: wideString;
  42.       FCorreo: wideString;
  43.     published
  44.       property Titulo: widestring read FTitulo write FTitulo;
  45.       property Nombre: widestring read FNombre write FNombre;
  46.       property Apellidos: widestring read FApellidos write FApellidos;
  47.       property Fecha: widestring read FFecha write FFecha;
  48.       property Direccion: widestring read FDireccion write FDireccion;
  49.       property Ciudad: widestring read FCiudad write FCiudad;
  50.       property Pais: widestring read FPais write FPais;
  51.       property CodPostal: widestring read FCodPostal write FCodPostal;
  52.       property TelCasa: widestring read FTelCasa write FTelCasa;
  53.       property TelOficina: widestring read FTelOficina write FTelOficina;
  54.       property Celular: widestring read FCelular write FCelular;
  55.       property Correo: widestring read FCorreo write FCorreo;
  56.   end;
  57.           { Invokable interfaces must derive from IInvokable }
  58.  
  59.     function GetClientNames: widestring; stdcall;
  60.     function GetClientsData(EmpID: integer): widestring; stdcall;
  61.     function AddClient(ParamsStr:trParams): trRetorno; stdcall;
  62.     function DeleteClient(EmpID: integer): trRetorno; stdcall;
  63.     function UpdateClient(EmpID:integer; ParamsStr:trParams): trRetorno; stdcall;
  64.  
  65. implementation
  66.  
  67. uses WSdbAccessImpl;
  68.  
  69. initialization
  70.   { Invokable interfaces must be registered }
  71.   InvRegistry.RegisterInterface(TypeInfo(IWSdbAccess));
  72.   function TWSdbAccess.GetClientNames: widestring;
  73. begin
  74.   dm := TfrmDataModule.Create (nil);
  75.   try
  76.     dm.dsClientList.Open;
  77.     if dm.dsClientList.RecordCount > 0 then begin
  78.       Result := FieldsToXml ('ClientList', dm.dsClientList);
  79.     end
  80.     else begin
  81.           Result := '<ClientList>' + sLineBreak +
  82.                     '</ClientList>' + sLineBreak;
  83.     end;
  84.   finally
  85.     dm.dsClientList.Close;
  86.     dm.CLIENTES.Close;
  87.     dm.Free;
  88.   end;
  89. end;
  90. end.



WSdbACCESSimpl.pas:



delphi
  1. { Invokable implementation File for TWSdbAccess which implements IWSdbAccess }
  2.  
  3. unit WSdbAccessImpl;
  4.  
  5. interface
  6.  
  7. uses Soap.InvokeRegistry, System.Types, Soap.XSBuiltIns, WSdbAccessIntf;
  8.  
  9. type
  10.  
  11.   { TWSdbAccess }
  12.   TWSdbAccess = class(TInvokableClass, IWSdbAccess)
  13.  
  14.   end;
  15.   implementation
  16. function MakeXmlStr (node, value: string): string;
  17. begin
  18.   Result := '<' + node + '>' + value + '</' + node + '>';
  19. end;
  20.  
  21. function FieldsToXml (rootName: string; data: TSQLDataSet1): string;
  22. var
  23.   i: Integer;
  24. begin
  25.   Result := '<' + rootName + '>' + sLineBreak;;
  26.   for i := 0 to data.FieldCount - 1 do
  27.       Result := Result + '  ' + MakeXmlStr (
  28.                 LowerCase (data.Fields[i].FieldName),
  29.                 data.Fields[i].AsString) + sLineBreak;
  30.   Result := Result + '</' + rootName + '>' + sLineBreak;;
  31. end;
  32. interface
  33.  
  34. uses InvokeRegistry, Types, XSBuiltIns, WSdbAccessIntf,uDataModule, sysUtils, sqlExpr;
  35.  
  36. type
  37.  
  38.   { TWSdbAccess }
  39.   TWSdbAccess = class(TInvokableClass, IWSdbAccess)
  40.   public
  41.     function GetClientNames: widestring; stdcall;
  42.     function GetClientsData(EmpID: integer): widestring; stdcall;
  43.     function AddClient(ParamsStr:trParams): trRetorno; stdcall;
  44.     function DeleteClient(EmpID: integer): trRetorno; stdcall;
  45.     function UpdateClient(EmpID:integer; ParamsStr:trParams): trRetorno; stdcall;
  46.   end;
  47.  
  48.  
  49.  
  50.  
  51. initialization
  52. { Invokable classes must be registered }
  53.   InvRegistry.RegisterInvokableClass(TWSdbAccess);
  54. end.
  55.  
  56. implementation
  57.  
  58.  
  59. initialization
  60. { Invokable classes must be registered }
  61.   InvRegistry.RegisterInvokableClass(TWSdbAccess);
  62. end.



Otra cosa esta dentro de la carpeta projects de delphi en una subcarpeta prueba.
No se como deberia llamar a mi archivo .dll desde el navegador. Podrias explicar eso tambien

Gracias

  • 0

#71 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.460 mensajes
  • LocationMéxico

Escrito 10 marzo 2014 - 10:20

:embarrassed: caray veo ese código y me da pena, debo hacer algo para actualizarlo, el manejo de los XML está de lo peor, pero habrán de perdonarme, no sabía muchas cosas en ese tiempo y tuve que improvisar, bueno no es que ahora sea el mejor, pero manejar XML ya es más fácil :D

Ahora mismo estoy algo complicado de trabajo, pero llegando a casa atiendo a tu requerimiento.

Saludos
  • 0

#72 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 14 junio 2014 - 10:44

Hola egostar estaba pensando lo siguiente:

¿Que tienes previsto si se corta la conexion a internet por unos dias, como haces con la bd?
  • 0

#73 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.460 mensajes
  • LocationMéxico

Escrito 18 julio 2014 - 10:43

Hola egostar estaba pensando lo siguiente:

¿Que tienes previsto si se corta la conexion a internet por unos dias, como haces con la bd?


Pues.... No tengo previsto nada al respecto, de hecho, últimamente he visto ésta preocupación en varios foros y me sigo preguntando como solucionar el problema y no he logrado ver algo que sea realmente práctico, porque además hay que ver de que lado es el problema, si es porque el servicio de hospedaje no está disponible o porque el servidor sufrió algún daño o si el medio (Internet) no es el que está disponible o porque la empresa (lado cliente) tiene problemas en su infraestructura, es decir, a cada problema corresponde una solución diferente y habrá que contemplar la mayoría de soluciones alternas.

Saludos

  • 0

#74 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 18 julio 2014 - 02:39

Pues un modelo practico seria montar un webservice por sucursal, y a su vez conectar todo a un webservice central, entonces si se cae el servidor o se corta internet las sucursale pueden seguir.
  • 0

#75 MrThian

MrThian

    Newbie

  • Miembros
  • Pip
  • 2 mensajes
  • LocationColombia

Escrito 09 octubre 2017 - 05:59

Hola,

 

de antemano déjame felicitarte por tan excelente tutorial, me sirvió bastante para algo que necesitaba hacer..

 

Pero ahora tengo una duda.. al intentar consumir el servicio web desde el Cliente el XML me retorna  con esto &lt; no me pone los caracteres < > para las etiquetas.. 

 

agradezco tu colaboración, y nuevamente felicitaciones.


  • 0

#76 MrThian

MrThian

    Newbie

  • Miembros
  • Pip
  • 2 mensajes
  • LocationColombia

Escrito 29 noviembre 2018 - 02:38

Hola, excelente tutorial.

 

De antemano quiere agradecerte por compartir este tipo de temas, ha sido de demasiada ayuda.

 

 

Ahora bien, aprovechando el tutorial decidí crear un web services con Delphi conectado a base de datos ya que se tenia como proyecto conectaro dos software por SOAP, hasta aqui todo perfecto.
Se deja en producción con tan mala fortuna que despues de varios envios al servicio web (un promedio de mas de 300 envios) genera el siguiente error:


php
  1. Classname: EAccessViolation
  2. Error: Access violation at address 0227AB73 in module 'WSDLLInterconexiones.dll'. Read of address 00000000

Hasta ahora la unica solución que se ha encontrado es reiniciar los servicios del IIS, para restuarar la comunicación entre los dos software.

 

Información del web services.

Base de datos: postgres

Delphi XE8

Componentes BD: FireDAC

Gracias, espero puedan ayudarme.


  • 0

#77 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.460 mensajes
  • LocationMéxico

Escrito 29 noviembre 2018 - 06:38

Hola, excelente tutorial.

 

De antemano quiere agradecerte por compartir este tipo de temas, ha sido de demasiada ayuda.

 

 

Ahora bien, aprovechando el tutorial decidí crear un web services con Delphi conectado a base de datos ya que se tenia como proyecto conectaro dos software por SOAP, hasta aqui todo perfecto.
Se deja en producción con tan mala fortuna que despues de varios envios al servicio web (un promedio de mas de 300 envios) genera el siguiente error:


php
  1. Classname: EAccessViolation
  2. Error: Access violation at address 0227AB73 in module 'WSDLLInterconexiones.dll'. Read of address 00000000

Hasta ahora la unica solución que se ha encontrado es reiniciar los servicios del IIS, para restuarar la comunicación entre los dos software.

 

Información del web services.

Base de datos: postgres

Delphi XE8

Componentes BD: FireDAC

Gracias, espero puedan ayudarme.

 

Hola MrThian, bienvenido a Delphiaccess,

 

Gracias por tus palabras, hacen que valga la pena compartir nuestras aventuras. (y)

 

No tengo  todo el contexto pero así de "bote pronto" me parece que tienes alguna consulta que no liberas y se satura la memoria, revisa que cualquier componente que estés utilizando lo liberes.

 

Saludos

 

PD, ahora veo que hace un poco mas de un año ya habías realizado una consulta y no te respondí, disculpa.  :embarrassed:


  • 0




IP.Board spam blocked by CleanTalk.