PDA

Ver la Versión Completa : Incluir Headers de SOAP en web services Delphi 2010


Revow
15-05-2015, 03:02:15
Hola club, el día de hoy tengo un problema al consumir un web service, les platico el problema.

Estoy trabajando con Delphi 2010, creando una aplicación que consume un web service, ya importe el WSDL desde la opción "WSDL Importer" de Delphi, En la definición del WSDL viene la especificación de un Header (AuthHeader) el cual ya definí con sus dos parametros username y password y hasta ahí todo bien, el problema es que vienen otras cabeceras que NO están definidas en el WSDL y que en la documentación del web service me indican que debo crear las clases para poder enviarlas desde SOAPHeaders y al no estar definidas en el WSDL por consiguiente no han sido importadas y declaradas.

Mi pregunta es ¿como debo crear estas clases tomado como base el SOAP que anexo? o ¿por donde debo buscar para poder agregar las cabeceras con sus respectivos atributos?

Anexo SOAP que ya probé y funciona sin ningún problema desde el programa SOAPUi en el podrán identificar el nodo Security y sus nodos Usernametoken y Timestamp; esas cabeceras son las que me falta definir en Delphi.

Nota modifica las URL porque aun no tengo permisos para enviar enlaces

<soapenv:Envelope xmlns:soapenv="ht/schemas.xmlsoap.org/soap/envelope/" xmlns:slm="ht://schemas">
<soapenv:Header>
<slm:AuthHeader>
<slm:Username>userAuth</slm:Username>
<slm:Password>passAuth</slm:Password>
</slm:AuthHeader>
<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="ht/docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="ht/docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsu:Timestamp wsu:Id="TS-12">
<wsu:Created>2015-05-14T21:03:00.172</wsu:Created>
<wsu:Expires>2015-05-14T21:59:00.172</wsu:Expires>
</wsu:Timestamp>
<wsse:UsernameToken wsu:Id="UsernameToken-4">
<wsse:Username>usertoken</wsse:Username>
<wsse:Password Type="ht/docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">passtoken</wsse:Password>
<wsse:Nonce EncodingType="ht/docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">V33AMPBA==</wsse:Nonce>
<wsu:Created>2012-03-27T20:24:39.172Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<slm:GetL>
<slm:Lead>9</slm:Lead>
</slm:GetL>
</soapenv:Body>
</soapenv:Envelope>

De antemano muchas gracias y saludos

TOPX
15-05-2015, 19:14:29
Hola,

1. Hay que ver el WSDL original (incluyendo posibles XSD anexos), porque SoapUI debe detectar esos headers de alguna parte, seguramente no los está inventando. Además, para verificar si el Wsdl Importer de otra versión de Delphi sí los tiene en cuenta.

2. Como último recurso, cuando ya se ha agotado la última esperanza y se ha renunciado a algunos principios morales/éticos, podría considerar el evento BeforeExecute del THttpRio para "maquillar" el contenido del envelope a enviar.

-

Revow
15-05-2015, 19:38:29
Hola TOPX, gracias por la respuesta, te comento, respecto al WSDL te platico que no vienen esas cabeceras y efectivamente SOAPUi no las detecta, ese ejemplo que subí viene en la documentación de Web Service y como les comentaba ahi mismo indica que deben ser creadas esas clases.

Respecto a tu segunda opción tendrás algún ejemplo como poder hacer lo que mencionas en el evento BeforeExecute del THttpRio para "maquillar" el contenido del envelope a enviar

Saludos.

TOPX
15-05-2015, 20:17:04
No tengo.

Pero en la web se encuentran ejemplos fácilmente, como éstos:


SOAP Request issue with HTTPRIO component - StackOverflow (http://stackoverflow.com/a/21548269/267964)
THttprio onBeforeExecute changing the soapRequest - StackOverflow (http://stackoverflow.com/a/2814937/267964)

-

Revow
17-05-2015, 03:08:26
Gracias Topx, ya pude armar el SOAP con las headers en el evento HTTPRIO1BeforeExecute, en si lo que hago es armar por completo el SOAP, pero ahora me manda el error: Se requiere un certificado para completar la autenticación de cliente - URL:https://web.pp.com/SLMi5/TWebService.asmx?wsdl

TOPX
19-05-2015, 16:22:34
Armar todo el envelope en ese evento no es nada conveniente, empezando porque así ya no hace gracia la serialización de objetos; por eso hice énfasis en "maquillar". Espero que el tiro no le salga por la culata.

Nunca he utilizado webservices a través de HTTPS, pero leyendo en la web parece que se logra asignando un TIdSSLIOHandlerSocketOpenSSL a la propiedad IOHandler del manejador de peticiones interno en el THttpRIO ~
Developer creates TIdHTTPRIO instance and initializes HTTPWebNode.HttpClient property. Using of TIdHTTPRIO is absolutely the same as THTTPRIO. For more information see Using Web Services Delphi documentation.
-

Revow
20-05-2015, 00:32:59
Gracias, echare un vistazo y les comento como me fue