Ir al contenido



Foto

Consumir web service desde delphi con tecnologia soap

xml soap ws webService delphi

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

#1 MarCaribe

MarCaribe

    Member

  • Miembros
  • PipPip
  • 34 mensajes

Escrito 31 mayo 2019 - 02:47

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
  • 13.954 mensajes
  • LocationMéxico

Escrito 31 mayo 2019 - 03:40

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 MarCaribe

MarCaribe

    Member

  • Miembros
  • PipPip
  • 34 mensajes

Escrito 01 junio 2019 - 10:41

Egostar Gracias.


  • 0

#4 MarCaribe

MarCaribe

    Member

  • Miembros
  • PipPip
  • 34 mensajes

Escrito 05 junio 2019 - 11:06

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
  • 13.954 mensajes
  • LocationMéxico

Escrito 05 junio 2019 - 11:22

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 MarCaribe

MarCaribe

    Member

  • Miembros
  • PipPip
  • 34 mensajes

Escrito 05 junio 2019 - 04:39

mil gracias, egostar.


  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.954 mensajes
  • LocationMéxico

Escrito 05 junio 2019 - 08:29

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 MarCaribe

MarCaribe

    Member

  • Miembros
  • PipPip
  • 34 mensajes

Escrito 06 junio 2019 - 08:06

Claro que sí: ...

Por PM
  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.954 mensajes
  • LocationMéxico

Escrito 06 junio 2019 - 09:27

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.

Archivos adjuntos


  • 0

#10 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.954 mensajes
  • LocationMéxico

Escrito 06 junio 2019 - 09:34

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 MarCaribe

MarCaribe

    Member

  • Miembros
  • PipPip
  • 34 mensajes

Escrito 07 junio 2019 - 10:38

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


  • 1





Etiquetado también con una o más de estas palabras: xml, soap, ws, webService, delphi