Ver Mensaje Individual
  #23  
Antiguo 04-11-2015
iMia iMia is offline
Miembro
 
Registrado: jul 2010
Posts: 141
Reputación: 14
iMia Va por buen camino
Thumbs up

bueno os informo de los progresos que estamos haciendo con espinete...

Empezado por espinete
Cita:
Creo que tengo algo...

He buscado por cómo añadir headers a la petición soap antes de hacer el envío y encontré un post en StackOverflow (en Delphi):
http://stackoverflow.com/questions/2...814937#2814937

Concretamente, en el evento BeforeExecute del componente HTTPRIO, obtenemos la petición que se va a enviar y la podemos "cambiar" sobre la marcha. Precisamente este usuario necesitaba hacer algo parecido a lo que intentamos nosotros (añadir la sección headers).

Luego he usado ese mismo evento para obtener lo que envía nuestra aplicación al webservice, en un Memo, y efectivamente, falta la sección <soapenv:Header> en el XML.

Bien

No obstante, no creo que esta sea la forma de conseguirlo. El XML podemos rellenarlo antes (incrustar la sección header con la firma, certificado, etc.). Lo que no me parece muy lógico es tener que firmar 2 veces el XML (una para firmar la factura y otra para el header), pero bueno, supongo que es normal.
Sí, aunque lo normal sería algo así...


Código Delphi [-]
var
  sphdr: TSOAPHEADERS;
  htpr: THTTPRIO;
  ws: SSPPWebServiceProxyPort;
...
begin
  sphdr := TSOAPHEADERS.create;
  htpr := THTTPRIO.create(self);
  htpr.SOAPHeaders.Send(sphdr);
  ws := GetSSPPWebServiceProxyPort(false, '', htpr);
...

Pero hay que enviar en la cabecera, todo el mensaje entero firmado...
por lo que hay que parsearlo o meterlo a mano antes de enviarlo con el evento BeforeExecute del httprio.
Es decir, en el evento, se coge el mensaje que se va a enviar (lo que hay en body, aunque contenga documentos firmados o no...), se firma, y se mente en la cabecera.
De esta forma ellos pueden comprobar que el mensaje que les llega, no está manipulado, ya que les llega sin firmar y firmado, comprueba la firma y si es correcta, al abrirlo, lo comparan con lo enviado... si es igual, está todo correcto y continúan...

Por lo que para ello hay que definir la función que capturará en evento...

Código Delphi [-]
 
  procedure HTTPRIO_BeforeExecute(const MethodName: string; SOAPRequest: TStream);

definir el httprio, asignarle el evetno y utilizarlo como vehículo del webservice...

Código Delphi [-]
var
  ws: SSPPWebServiceProxyPort;
  ...
begin
  htpr := THTTPRIO.create(self);
  htpr.OnBeforeExecute := HTTPRIO_BeforeExecute;

  ws := GetSSPPWebServiceProxyPort(false, '', htpr);
...

el evento se define tal que...

Código Delphi [-]
procedure TMDIMainForm.HTTPRIO_BeforeExecute(const MethodName: string; SOAPRequest: TStream);
var
  xmlCall: TXMLDocument;
begin
   try
      // Posicionarse al inicio del stream
      SOAPRequest.Position := 0;
      // pasar el stream a un xmlDoc... o donde se quiera...
      xmlCall.LoadFromStream(SOAPRequest);
      // Firmarlo y meterlo en la cabecera...

...
Responder Con Cita