Как сжать SOAPMessage в SAAJ API? - PullRequest
       57

Как сжать SOAPMessage в SAAJ API?

0 голосов
/ 14 февраля 2019

Я пытаюсь использовать SAAJ API для отправки SOAP-запроса с вложениями с помощью gzip.Я только начал использовать SAAJ, поэтому я не очень знаком, но я не смог найти ни одного примера / использования, делающего то же самое в Интернете.Все, что я вижу, просто добавляет заголовок 'accept-encoding', 'gzip', но это ничего не дает, просто говорит серверу, чего ожидать от меня.Я попытался сжать свое исходное сообщение и записать его в новое сообщение перед отправкой, но я получаю сообщение об ошибке, в котором говорится, что начальная граница отсутствует.ниже приведен код, который я использую для генерации сообщения и gzip его перед отправкой.

    SOAPConnectionFactory cf = null;
    SOAPConnection conn = null;
    SOAPMessage message = null;
    SOAPMessage response = null;
    TransformerFactory tf = null;
    Transformer transformer = null;
    StringWriter writer = null;
    MessageFactory fac = null;
    TransmissionPayload payload = null;
    SOAPMessage gzipMessage = null;
    try
    {
        tf =  TransformerFactory.newInstance();
        transformer = tf.newTransformer();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");

        writer = new StringWriter();
        transformer.transform(new DOMSource(doc), new StreamResult(writer));

        fac = MessageFactory.newInstance();
        message = fac.createMessage(new MimeHeaders(), new ByteArrayInputStream(writer.getBuffer().toString().getBytes()));

        message.getMimeHeaders().addHeader("Accept-Encoding", "gzip,deflate");
        //ADD ATTACHMENT
        message.addAttachmentPart(message.createAttachmentPart(
                new StreamSource(
                        new ByteArrayInputStream(FileUtils.readFileToByteArray(file))), "text/xml"));

        message.setProperty(SOAPMessage.WRITE_XML_DECLARATION, "true");
        message.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, "utf-8");

        cf = SOAPConnectionFactory.newInstance();
        conn = cf.createConnection();

        //GZIP ORIGINAL MESSAGE HERE
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        message.writeTo(out);
        byte[] msg = out.toByteArray();

        ByteArrayOutputStream out2 = new ByteArrayOutputStream();

        GZIPOutputStream os = new GZIPOutputStream(out2);
        os.write(msg);
        os.flush();
        os.close();

        //CREATING NEW MESSAGE FROM GZIP. 
        gzipMessage = fac.createMessage(message.getMimeHeaders(), new ByteArrayInputStream(out2.toByteArray()));

        response = conn.call(gzipMessage, new URL(IRS_BRQ_URL));
        if(response != null)
        {
            Source src = response.getSOAPPart().getContent();
            tf = TransformerFactory.newInstance();
            transformer = tf.newTransformer();
            DOMResult res = new DOMResult();
            transformer.transform(src, res);

            payload = new TransmissionPayload(200, (Document)res.getNode(), null);
        }
    }catch(Exception e)
    {
        throw new AirException("A2AConnection.SAAJ: Exception: ", e);
    }finally
    {
        cf = null;
        conn = null;
        message = null;
        tf = null;
        transformer = null;
        writer = null;
        fac = null;
    }

Если это вообще возможно, я предполагаю, что мне нужно будет только сжать часть SOAPMessage, а неполностью?У меня нет возможности сделать это без gzipping, поскольку конечная точка этого требует.

Любая помощь или направление приветствуется.Пожалуйста, дайте мне знать, если требуется дополнительная информация.

...