¿Cómo podríamos usar MTOM para enviar un zip con un csv adentro?
En primer lugar, gracias por su tiempo leyendo esta pregunta y gracias por su ayuda.
Tenemos el siguiente caso de uso: necesitaríamos enviar con MTOM un zip que contenga un csv
Hemos leído, investigado, indagado:
https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls...
https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls...
https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls...
Necesitaríamos replicar cómo SOAPUI envía un zip con un csv como archivo adjunto en una solicitud SOAP, empleando Ensemble
Siendo la petición raw de la siguiente manera:
¿Podrían ayudarnos o indicarnos la documentación necesaria, ejemplos de código o proyectos de Ensemble para estudiar, comprender y desarrollar este comportamiento? 💭
¿Hay algunos ejemplos de código o documentación que nos pueda ayudar? 💭
Gracias por su tiempo, respuestas y ayuda.
Hola Yone,
Entiendo que quieres implementar un cliente de WebService en Ensemble que utilice MTOM.
Supongo que ya tienes creado el cliente de WebService, el Business Operation y los Mensajes a partir del WSDL del WebService.
¿Has probado a sobreescribir el parámetro
MTOMREQUIRED
del cliente web y activarla?En Using MTOM for Attachments. Webclient, tienes un ejemplo de un cliente de servicio web que al invocarlo activa la propiedad
MTOMRequired
y donde además ha cambiado los tipos de datos por derivados de%Stream
:Hola Alberto, gracias por responder porque nos apoya y orienta lo que nos explicas, en concreto el ejemplo de la documentación y las dos indicaciones a implementar
Hemos escrito el siguiente WebService:
El sistema destino, nos pide por favor, que implementemos un WebService con MTOM y que envie los zip con csv de la siguiente forma:
Al importar el WSDL del sistema destino, se nos generó la cabecera del método "cargarFichero" con "fichero" como un "%xsd.base64Binary"
Siguiendo tus indicaciones, hemos cambiado fichero por "%GlobalCharacterStream"
De esta forma se envía el fichero, el csv, sin codificar, dentro de un CDATA
Siendo la respuesta del sistema destino:
Sin embargo, como observamos en la primera imagen, el sistema destino necesitaría, requeriría, que le enviemos el fichero codificado en binario, ya que pone:
Content-Transfer-Encoding: binary
Cuando adaptamos el fichero para que sea "%GlobalBinaryStream" vemos la siguiente traza, donde sí se codifica en binario:
Al enviar codificado en binario, el sistema destino también responde:
En resumen, el sistema destino necesita de nosotros: "añadir el parámetro “name” dentro de la cabecera “Content-Type” al adjuntar el archivo. Vuestro cliente debería generar dicho parámetro para no obtener dicho error."
Siendo la comparativa completa entre lo enviado por ensemble (sin el parámetro "name", por lo tanto es incorrecto) a la izquierda; y lo generado por el SoapUI (con el parámetro name, correcto), a la derecha:
Por favor, ustedes ¿podrían indicarnos ejemplos, documentación, proyectos, código, que nos sirva de referencia para indagar, investigar y completar el desarrollo?
Además hemos investigado las siguientes respuestas:
https://community.intersystems.com/post/add-parameter-name-inside-conten...
Muchas gracias por su tiempo, leyendo y respondiendo, gracias
Hola de nuevo Yone,
Por lo que comentas, quizá te falte añadir la cabecera Content-Disposition en la petición y ahí especificar el nombre del archivo.
Creo que en el ejemplo que habías hecho originalmente con SoapUI, esa cabecera tenía este valor:
En Fine Tuning a WebClient te habla de cómo puedes especificar cabeceras en tu cliente web utilizando el método
SetHttpHeader()
que hereda de%SOAP.WebClient
.Así que puedes probar a especificar con
SetHttpHeader()
la cabeceraContent-Disposition
y añadir el nombre del fichero que quieras que aparezca.Gracias por responder Alberto,
es un apoyo, alivio y ayuda, la orientación que nos ofreces
Siguiendo tu criterio, y la explicación de la documentación, hemos añadido:
La línea la hemos escrito antes de:
Al capturar el LOGSOAP observamos que se queda sin incluir la cabecera Content-Disposition y el nombre application.zip en lo que enviamos:
¿Por qué podría ser que al escribir la línea, se quede sin incluir la nueva cabecera Content-Disposition y el nombre del fichero application.zip? 💭🤔
Además, en otras pruebas, hemos escrito 3 formas adicionales, para tratar de resolverlo:
Mediante la línea anterior, no se ve que añada el parámetro "name"
Probamos con la siguiente línea y generaría excepción Ensemble:
Genera excepcion: ERROR #5001: <INVALID OREF>zcargarFichero+16^WSCLIENTE.HistoriaClinica.FicheroVacuServiceSOAP.1
y mediante:
Nos da excepción también:
ERROR #5001: <INVALID OREF>zcargarFichero+16^WSCLIENTE.HistoriaClinica.FicheroVacuServiceSOAP.1
La clase completa que hemos escrito del Servicio Web es:
¿Cómo podríamos indagar, depurar, ajustar, y resolver juntos, esta situación?
Si nos pudieran orientar, se los agradeceríamos 🙇♂️🙏🙏
¿Cómo recomendarían ustedes seguir?
¿Qué documentación necesitamos estudiar, leer, entender, para completar esta parte?
Gracias por las respuestas
Hola Yone,
En principio el
..SetHttpHeader()
debería ser suficiente.Puedes probar con:
¿El Servicio Web sigue devolviendo un error respecto al Name?
Supongo que estás utilizando
^ISCSOAP
para examinar lo que se envía al WebService. Dependiendo de tu versión de Ensemble o Health Connect podrás utilizar las opciones de ISCSOAP para que te muestre las cabeceras HTTP:Aquí en InterSystems IRIS SOAP Log te explica las diferentes opciones. Comprueba en la documentación de tu versión específica si están las opciones para las cabeceras HTTP y así asegurarte de que se muestran.
He hecho una prueba rápida en una 2020.1 y en el log de ISCSOAP debería tener una pinta así:
Si en tu versión no se pueden mostrar las cabeceras en el log quizá puedes utilizar herramientas externas como WireShark, etc.
Échale un vistazo a esto, y si no logras avanzar escríbeme por correo y quedamos y lo revisamos.
Gracias Alberto por tu respuesta y por dedicarnos tu tiempo,
Hemos añadido:
Activamos el LOGSOAP:
Observamos que unicamente se incluyen las cabeceras SOAP, y no las HTTP en la traza:
Siguiendo el consejo que nos indicas, leemos la documentación de la versión que empleamos:
Y nos sale que la opción "H" en el ^ISCSOAP que nos permitiría observar las cabeceras HTTP, está sin incluir:
Tienes razón, Alberto, el Servicio Web destino, nos sigue respondiendo que faltaría la propiedad name:
¿Cómo podríamos continuar?
¿De qué forma depuraríamos las cabeceras HTTP del envío del fichero mediante SOAP?
¿Ustedes como nos recomiendan que sigamos?
¿Cuáles serían los siguientes pasos?
Muchas gracias por tus respuestas Alberto, y sobre todo gracias por indicarnos la documentación y ejemplos concretos y prácticos
Hola Yone,
Lo que te indicaba antes. Necesitarás en ese caso otra herramienta como Wireshark que te permita capturar las cabeceras que se envían al servicio web y ver si están bien.
Dale una vuelta con eso y si no consigues avanzar me escribes por email y buscamos la forma de revisarlo conjuntamente.
Disculpen, había cometido un error
Necesitamos usar el mecanismo llamado "Attachment" para enviar el fichero como un adjunto en la petición SOAP; y no el mecanismo alternativo, conocido como "MTOM"
Hemos añadido las siguientes líneas en el Cliente Web:
Siguiendo la documentación:
Using SOAP with Attachments: Web Client
¿Qué podría significar que el sistema destino nos devuelva un código http 511?
Parece que podría indicar lo siguiente:
"El código de estado de respuesta HTTP 511 Network Authentication Required indica que el cliente necesita autenticarse para obtener acceso a la red."
En estos casos, ¿qué se suele necesitar?
En el LOGSOAP veríamos:
¿se implementaría una autenticación desde nuestra Operacion SOAP o Cliente Web, hacia el sistema destino?
¿qué recomiendan ustedes?
¿cómo continuaríamos? ¿cuáles son los siguientes pasos?
Gracias por leernos, y por su ayuda con las respuestas
Hola Yone, me alegro de que al final hayas encontrado el mecanismo de Attachment para enviarlo :)
Respecto a la autenticación, deberías revisar las especificaciones del servicio web al que te quieres conectar.
Creo que estás intentando conectar a un servicio web del Ministerio para enviar comunicaciones, por experiencias pasadas creo recordar que suelen pedir al menos:
* Cabeceras WSA (parece que ya tienes algunas puestas).
* Firma del mensaje con token y un timestamp. La firma debería incluir el timestamp, el cuerpo SOAP, el token y las cabeceras WSA.
Pero repito, confírmalo por favor con la documentación de las especificaciones del servicio web al que te quieras conectar.
Puedes echar un vistazo a la documentación aquí:
https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI...
En cualquier caso lo dicho, si necesitas algún ejemplo específico o comentar alguna cosa concreta puedes escribirme por email y buscamos un rato para echarlo un ojo.
Nuestras redes sociales
Recursos InterSystems
Iniciar sesión o registrarse
Inicie sesión o cree una nueva cuenta para continuar
Iniciar sesión o registrarse
Inicie sesión o cree una nueva cuenta para continuar
Iniciar sesión o registrarse
Inicie sesión o cree una nueva cuenta para continuar