Как я могу создать правильную границу mime для моего сообщения soap? - PullRequest
0 голосов
/ 28 мая 2020

Мне нужно создать программу, которая создает сообщение 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 с вложением?

...