Jump to content


Photo

Consumir web service desde delphi con tecnologia soap

xml soap ws webService delphi

  • Please log in to reply
10 replies to this topic

#1 TMFV

TMFV

    Member

  • Miembros
  • PipPip
  • 40 posts

Posted 31 May 2019 - 02:47 PM

Hola amigos, he estado leyendo bastante desde otros foros y de este mismo foro temas parecidos pero no logro concretar en mi mente como solucionar este problema.

 

Resulta que estoy haciendo un cliente en delphi que consuma un web service:

http://..................s/input.asmx?wsdl

 

este debe ser consumido por medio de una funcion que recibe como parametro un xml, este xml me lo genera el wsdl de delhi así..

 

function  receiveRequest_Message(const xml_request: string): ArrayOfString; stdcall;

 

y este debe devolverme un mismo xml, el cual debo guardar como texto.

 

Pero mi experiencia con este tema es poca, no logro dar como obtener este xml_response.

 

Necesito ayuda de como podria salvar el xml de respuesta, agradezco su ayuda.

 

es poca la informacion que tengo, pido su orientación, por favor.


delphi
  1. procedure TForm1.EnviarSolicClick(Sender: TObject);
  2. var
  3. response: ArrayOfString;
  4. begin
  5. Memo_xml_response.Clear;
  6. if(Memo_xml_request.Text <> '')then
  7. response:= (httprio_1 as GetInputSoap).receiveRequest_Message(Memo_xml_request.Text);
  8.  
  9. end;

Muchas gracias.


  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 31 May 2019 - 03:40 PM

Hola Tatiana

 

Para guardar el request de un web service se debe utilizar el evento AfterExecute de HTTPRIO

 

Consulta éste hilo.

 

http://delphiaccess....cute#entry98228

 

Saludos


  • 0

#3 TMFV

TMFV

    Member

  • Miembros
  • PipPip
  • 40 posts

Posted 01 June 2019 - 10:41 AM

Egostar Gracias.


  • 0

#4 TMFV

TMFV

    Member

  • Miembros
  • PipPip
  • 40 posts

Posted 05 June 2019 - 11:06 AM

Egostar, tomando como referencia tu ayuda, y otras que encontré en la web, me gustaría compartirte e código que he ido construyendo y de las cuales he hecho uso de los componentes indy de delphi, use los eventos httprio_1AfterExecute y  httprio_1BeforeExecute, pero no me arrojo ninguna respuesta...

 

se con toda seguridad seguridad que no he aplicado algo correctamente en el código, por lo cual solicito vuestra ayuda.

aquí dejo colgado parte del código:


delphi
  1. unit USysnetAPP;
  2.  
  3. interface
  4.  
  5. uses
  6. Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7. Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Soap.InvokeRegistry,
  8. Soap.Rio, Soap.SOAPHTTPClient, IdBaseComponent, IdComponent, IdTCPConnection,
  9. IdTCPClient, IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL;
  10.  
  11. type
  12. TForm1 = class(TForm)
  13. Memo_xml_request: TMemo;
  14. OpenDialog1: TOpenDialog;
  15. Button1: TButton;
  16. EnviarSolic: TButton;
  17. Memo_xml_response: TMemo;
  18. httprio_1: THTTPRIO;
  19. IdHTTP1: TIdHTTP;
  20. IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
  21. procedure Button1Click(Sender: TObject);
  22. procedure httprio_1BeforeExecute(const MethodName: string;
  23. SOAPRequest: TStream);
  24. procedure httprio_1AfterExecute(const MethodName: string;
  25. SOAPResponse: TStream);
  26. procedure EnviarSolicClick(Sender: TObject);
  27. private
  28. { Private declarations }
  29. public
  30. { Public declarations }
  31. end;
  32.  
  33. var
  34. Form1: TForm1;
  35.  
  36. implementation
  37.  
  38. {$R *.dfm}
  39.  
  40. uses input;
  41.  
  42. procedure TForm1.Button1Click(Sender: TObject);
  43. begin
  44. //buscamos en el equipo
  45. if OpenDialog1.Execute then
  46. Memo_xml_request.Clear;
  47. Memo_xml_request.Lines.LoadFromFile(OpenDialog1.FileName);
  48. end;
  49.  
  50. procedure TForm1.EnviarSolicClick(Sender: TObject);
  51. var
  52. wsdl: InputSoap;
  53. http: TIdHTTP;
  54. ssl: TIdSSLIOHandlerSocketOpenSSL;
  55. xmlRequest: TStringStream;
  56. xmlResponse: ArrayOfString;
  57. i: integer;
  58. dato, cadena: string;
  59. begin
  60. xmlRequest:= TStringStream.Create(Memo_xml_request.Lines.Text);
  61. //preparamos la peticion requerida
  62. http:= TIdHTTP.Create(nil);
  63. ssl:= TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  64. ssl.SSLOptions.Method:= sslvSSLv3;
  65. http.IOHandler:= ssl;
  66. http.Request.ContentType:= 'text/xml';
  67. http.ConnectTimeout:= 100000;
  68. http.ReadTimeout:= 10000;
  69. try
  70. xmlResponse:= wsdl.receiveRequest_Message(Memo_xml_request.Text);
  71. http.Disconnect;
  72. //mostramos datos en memo - de arrayOfStrings to strings
  73. for I := Low(xmlResponse) to High(xmlResponse) do
  74. begin
  75. dato:= xmlResponse[I];
  76. cadena:= ' ' + dato;
  77. end;
  78. Memo_xml_response.Lines.Add(cadena);
  79. except on E: Exception do
  80. ShowMessage('ERROR SERVER: ' + E.Message);
  81. end;
  82. //liberamos de memoria a
  83. http.Free;
  84. ssl.Free;
  85. xmlRequest.Free;
  86. end;
  87.  
  88. procedure TForm1.httprio_1AfterExecute(const MethodName: string;
  89. SOAPResponse: TStream);
  90. {var
  91.   arrStr: TStringStream; }
  92. begin
  93. { arrStr := TStringStream.Create('');
  94.   try
  95.   arrStr.CopyFrom(SOAPResponse, 0);
  96.   SOAPResponse.Position:= 0;
  97.   Memo_xml_response.Lines.Text:= arrStr.DataString;
  98.   finally
  99.   arrStr.Free;
  100.   end; }
  101. end;
  102.  
  103. procedure TForm1.httprio_1BeforeExecute(const MethodName: string;
  104. SOAPRequest: TStream);
  105. { var
  106.   req: TStringStream; }
  107. begin
  108. { req:= TStringStream.Create('');
  109.   req.LoadFromStream(SOAPRequest);
  110.   Memo_xml_request.Lines.Text:= req.DataString; }
  111. end;
  112.  
  113. end.


  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 05 June 2019 - 11:22 AM

Hola Tatiana

 

Veo que agregaste los eventos y el componente, pero no veo donde lo estás usando, en un tiempecito que tenga mas tarde veré mas a detalle tu código e intentaré ayudarte.

 

Saludos


  • 0

#6 TMFV

TMFV

    Member

  • Miembros
  • PipPip
  • 40 posts

Posted 05 June 2019 - 04:39 PM

mil gracias, egostar.


  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 05 June 2019 - 08:29 PM

Hola Tatiana

 

Asumo que tu código funciona y envía la petición al webService y obtiene una respuesta, pero algo me está faltando para entender el proceso.

 

¿Que probabilidades hay de que nos muestres la unidad input.pas ?

 

Saludos


  • 0

#8 TMFV

TMFV

    Member

  • Miembros
  • PipPip
  • 40 posts

Posted 06 June 2019 - 08:06 AM

Claro que sí: ...

Por PM
  • 1

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 06 June 2019 - 09:27 PM

Hola Tatiana

 

Adjunto encontrarás un pequeño proyecto para que lo ejecutes y veas si es lo que necesitabas, solo agrega la unidad INPUT.PAS al mismo y listo.

 

Espero te ayude, saludos.

Attached Files


  • 0

#10 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 06 June 2019 - 09:34 PM

Tambien dejo por aquí el código usado.
 
 


delphi
  1. implementation
  2.  
  3.  
  4. {$R *.dfm}
  5.  
  6.  
  7. uses input;
  8.  
  9.  
  10. procedure TForm2.Button1Click(Sender: TObject);
  11. var
  12.   servicio: InputSoap;
  13.   retorno: ArrayOfString;
  14.   I: Integer;
  15. begin
  16.   MiRIO := THTTPRIO.Create(nil);
  17. //Asignamos los eventos BeforeExecute y AfterExecute al objeto MiRIO.
  18.   MiRIO.OnBeforeExecute := BeforeExecute;
  19.   MiRIO.OnAfterExecute := AfterExecute;
  20. //Asignamos los eventos BeforeExecute y AfterExecute al objeto MiRIO.
  21.   servicio := GetInputSoap(false, '', MiRIO);
  22.   retorno := servicio.receiveRequest_Message('Algo');  
  23. for I := 0 to length(retorno) do    
  24. mResult.Lines.Add(retorno[I]);
  25. end;
  26.  
  27. procedure TForm2.AfterExecute(const MethodName: string;
  28.   SOAPResponse: TStream);
  29. var
  30. arrStr: TStringStream;
  31. begin
  32.   arrStr := TStringStream.Create('');  
  33. try    
  34. arrStr.CopyFrom(SOAPResponse, 0);    
  35. SOAPResponse.Position:= 0;    
  36. mResponse.Lines.Text:= arrStr.DataString;  
  37. finally    
  38. arrStr.Free;  
  39. end;
  40. end;
  41.  
  42. procedure TForm2.BeforeExecute(const MethodName: string;
  43.   SOAPRequest: TStream);
  44. var
  45. req: TStringStream;
  46. begin  
  47. req:= TStringStream.Create('');    
  48. req.LoadFromStream(SOAPRequest);  
  49. mRequest.Lines.Text:= req.DataString;
  50. end;
  51.  
  52. end.

 
Saludos


  • 0

#11 TMFV

TMFV

    Member

  • Miembros
  • PipPip
  • 40 posts

Posted 07 June 2019 - 10:38 AM

Egostar. :) muchas gracias. Ya reviso en unas horas que he estado ocupada con otras cosillas :)


  • 1





Also tagged with one or more of these keywords: xml, soap, ws, webService, delphi

IP.Board spam blocked by CleanTalk.