Estoy en un cauce en cuanto a cómo agregar un archivo adjunto en mi solicitud SOAP. Tenemos que consumir un servicio web de terceros, construido en Java, que es lo más intrincado que me he encontrado. Cualquier otro servicio web que hayamos utilizado, que requiera archivos adjuntos, tiene un método o propiedad para agregar el archivo adjunto. Sencillo. Sin embargo, este no proporciona tal método.Agregar un archivo adjunto a la solicitud SOAP
Tenemos una versión del mensaje SOAP junto que es exactamente como queremos el XML, sin embargo, es la parte MIME del archivo que no podemos agregar.
Ejemplo:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
<soap:Header>
<payloadManifest xmlns="http://<examplePayload>">
<manifest contentID="Content0" namespaceURI="http://<exampleManifest>" element="ProcessRepairOrder" version="2.01" />
</payloadManifest>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsu:Created>2011-12-19T15:25:13Z</wsu:Created>
<wsu:Expires>2011-12-19T15:30:00Z</wsu:Expires>
</wsu:Timestamp>
<wsse:UsernameToken><wsse:Username>username</wsse:Username><wsse:Password>password</wsse:Password></wsse:UsernameToken></wsse:Security></soap:Header><soap:Body><ProcessMessage xmlns="<examplePayload"><payload><content id="Content0">
<s:ProcessRepairOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://example.xsd" xmlns:s="http://<exampleManifest>" xmlns:gwm="http://example">
<s:ApplicationArea>
<s:Sender>
<s:Component>Test</s:Component>
<s:Task>ProcessAttachment</s:Task>
<s:CreatorNameCode>Test</s:CreatorNameCode>
<s:SenderNameCode>XX</s:SenderNameCode>
<s:DealerNumber>111111</s:DealerNumber>
<s:DealerCountry>GB</s:DealerCountry>
</s:Sender>
<s:CreationDateTime>2010-03-26T13:37:05Z</s:CreationDateTime>
<s:Destination>
<s:DestinationNameCode>GM</s:DestinationNameCode>
<s:DestinationURI/>
<s:DestinationSoftwareCode>GWM</s:DestinationSoftwareCode>
</s:Destination>
</s:ApplicationArea>
<s:DataArea xsi:type="gwm:DataAreaExtended">
<s:Process/>
<s:RepairOrder>
<s:Header xsi:type="gwm:RepairOrderHeaderExtended">
<s:DocumentId/>
</s:Header>
<s:Job xsi:type="gwm:JobExtended">
<s:JobNumber/>
<s:OperationId>Test</s:OperationId>
<s:OperationName/>
<s:CodesAndComments/>
<s:Diagnostics/>
<s:WarrantyClaim xsi:type="gwm:WarrantyClaimExtended">
<s:OEMClaimNumber>00112233445566778899</s:OEMClaimNumber>
<gwm:Attachment>
<gwm:File><xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:test.gif"/></gwm:File>
<gwm:Filename>test.gif</gwm:Filename>
</gwm:Attachment>
</s:WarrantyClaim>
<s:LaborActualHours>0.0</s:LaborActualHours>
<s:Technician/>
</s:Job>
</s:RepairOrder>
</s:DataArea>
</s:ProcessRepairOrder>
</content></payload></ProcessMessage></soap:Body></soap:Envelope>
Esta es la parte XML que podemos generar y enviar, sin embargo, es incorrecto, ya que necesitamos una parte MIME allí como:
Antes XML:
--MIMEBoundary
Content-Type: application/xop+xml; charset=utf-8; type="text/xml"
Content-Transfer-Encoding: binary
Content-ID: <rootpart>
Después XML
--MIMEBoundary
Content-Type: image/gif; name=test.gif
Content-Transfer-Encoding: binary
Content-ID: <test.gif>
[email protected]�
--MIMEBoundary--
He buscado en Internet las respuestas, pero las he encontrado en blanco. No parece haber mucha documentación sobre el uso de WSE para esto. Debo enfatizar que WSE es un requisito en el lado del servidor, y no hay manera de que pueda cambiar la tecnología para abordar este problema.
¿Hay alguna manera de agregar estas secciones MIME?
EDITAR: Debo agregar que puedo obtener un documento XML que funcione enviado a través de SoapUI con archivos adjuntos, pero parece que no puede encontrar una forma dentro de nuestro código.
He añadido una recompensa para tratar de encontrar una solución a este problema. Si alguien tiene alguna otra idea, por favor avíseme.
EDITAR de nuevo: Sé que ha pasado una semana desde que pude verificar las respuestas aquí, pero aunque algunos dan una buena idea de dónde buscar, sigo dibujando un espacio en blanco. La terrible documentación que rodea al XopDocument
y sus métodos es un gran punto de fricción, si alguien tiene algún ejemplo del uso de SaveToXopPackage
, ¿podrían proporcionarlo, porque esto está comenzando a encenderse?
WSE es obsoleto y no debe usarse sin importar qué. –
Bien John, ¿qué le parece buscar una solución en lugar de solo pretender que sabe todo? En este escenario, para mí, se requiere WSE. Sin eso, nuestras solicitudes serán rechazadas. No puedo decirle al proveedor externo cómo deberían codificar, puedo intentarlo, pero siempre han sido la empresa menos útil del mundo para trabajar. Entonces, aunque WSE no debería usarse si está creando su propio software, es un requisito en este caso. – anothershrubery
Claramente, es una decisión de negocios si su compañía debe continuar haciendo negocios con un tercero que requiere que utilice software obsoleto, en comparación con algún competidor que no lo haga. –