Мне нужно создать программу, которая создает сообщение SOAP с вложенным файлом и записывает его в файл xml. Моя проблема в том, что я получил сообщение об ошибке от сервера, что вложение отсутствует.
Рабочий запрос генерирует следующий результат:
--MIMEBoundary_d030d6ae47aea1c105dfd6c50415a6aee8c94b6c128ce429
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: binary
Content-ID: <0.c030d6ae47aea1c105dfd6c50415a6aee8c94b6c128ce429@apache.org>
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
...
</soapenv:Header>
<soapenv:Body>
...
<DocumentDatas href="214327366202005271551134599">
... METADATA OF THE ATTACHEMENT
</DocumentDatas>
...
</soapenv:Body>
</soapenv:Envelope>
--MIMEBoundary_d030d6ae47aea1c105dfd6c50415a6aee8c94b6c128ce429
Content-Type: application/octet-stream; name="test.pdf"
Content-Transfer-Encoding: binary
Content-ID: <214327366202005271551134599>
%PDF-1.5
... Stream of the attachement (now it is a pdf file)
Мой запрос дает следующий результат:
------=_Part_0_1516369375.1590678013704
Content-Type: text/xml; charset=utf-8
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
...
</SOAP-ENV:Header>
<SOAP-ENV:Body>
...
<DocumentDatas href="1f04a0ed-3ede-4368-89df-95ded9417557">
...
</DocumentDatas>
...
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
------=_Part_0_1516369375.1590678013704
Content-Type: application/octet-stream; name='test.pdf'
Content-Transfer-Encoding: binary
Content-ID: <1f04a0ed-3ede-4368-89df-95ded9417557>
%PDF-1.4
... Stream
Мой код, который генерирует результат выше:
MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
SOAPMessage message = factory.createMessage();
//Generating the xml from the request class and putting it into the body part of the SOAPMessage
Marshaller marshaller = JAXBContext.newInstance(request.getClass()).createMarshaller();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.newDocument();
marshaller.marshal(request, document);
SOAPHeader header = message.getSOAPHeader();
SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
envelope.getBody().addDocument(document);
if (header == null) {
header = envelope.addHeader();
}
//Assembling the header part
SOAPElement securityElement = header.addChildElement("Security", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
SOAPElement usernameTokenElement = securityElement.addChildElement("UsernameToken", "wsse");
SOAPElement usernameElement = usernameTokenElement.addChildElement("Username", "wsse");
usernameElement.addTextNode(params.getUsername());
SOAPElement passwordElement = usernameTokenElement.addChildElement("Password", "wsse");
passwordElement.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
passwordElement.addTextNode(params.getPassword());
//Assembling AttachmentPart for the SOAPMessage
//attachments is a list containing Attachment objects as DataSource
//Attachment class implements DataSource
for (Attachment att : attachments) {
DataHandler dataHandler = new DataHandler(att);
AttachmentPart attachmentPart = message.createAttachmentPart(dataHandler);
attachmentPart.setMimeHeader("Content-Transfer-Encoding", "binary");
attachmentPart.setContentId("<" + att.getName() + ">");
attachmentPart.setContentType(att.getContentType() + "; name='" + inputFile.getName() + "'");
message.addAttachmentPart(attachmentPart);
}
//Writing the result into a file
message.saveChanges();
FileOutputStream fos = new FileOutputStream(DEFAULT_RAW_XML);
message.writeTo(fos);
Есть ли способ сгенерировать часть MIMEBoundary, как в первом примере xml, и как я могу ее изменить?
или
Есть ли альтернативы для создания SOAPMessage с вложением?