Как получить xml-ответ от конечной точки SOAP? - PullRequest
0 голосов
/ 03 июня 2019

Моя проблема в том, что у меня есть один URL-адрес конечной точки, который, если я добавлю в браузер, я смогу увидеть веб-сайт. Когда я использую эту конечную точку в программе почтальона с правильным запросом (xml), я получаю ответ xml. Что я и хочу. Но я пытаюсь получить такой же ответ в своем Java-приложении, но я получаю веб-сайт (html). Я не уверен, что не так

JAXBContext jaxbContext = JAXBContext.newInstance(Envelope.class);
            Marshaller jaxbMarshaler = jaxbContext.createMarshaller();
            jaxbMarshaler.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

            Date now = new Date();
            SimpleDateFormat formater = new SimpleDateFormat("ddMMyyhhmmss");
            fileName = "EMCS_" + tNumber.trim() + "_" + formater.format(now) + "_" + obtDto.getTransactionIdHost()
                + ".in";

            jaxbMarshaler.marshal(envelope, new File("C:\\Temp\\" + fileName));
            url = new URL(urlString);

            connection = (HttpsURLConnection) url.openConnection();
            connection.setUseCaches(false);
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Connection", "Keep-Alive");
            connection.setRequestProperty("Accept-Encoding", "gzip,deflate");
            connection.setRequestProperty("Accept", "*/*");
            connection.setRequestProperty("SOAPAction", "");
            connection.setRequestProperty("Cache-Control", "no-cache");
            connection.setRequestProperty("Authorization",
                "Basic " + Base64.encode("USER:PASSWORD".getBytes()));
            connection.setRequestProperty("Content-Type", "text/xml");

            BufferedOutputStream dos = new BufferedOutputStream(connection.getOutputStream());
            File file = new File("C:\\Temp\\" + fileName);
            BufferedInputStream fileOutput = new BufferedInputStream(new FileInputStream(file));
            byte[] b = new byte[(int) file.length()];

            for (int i = 0; i < b.length; i++) {
                b[i] = (byte) fileOutput.read();
                System.out.printf((char) b[i] + "");
            }

            dos.write(b);
            dos.flush();
            dos.close();
            fileOutput.close();

            System.out.println("RESPONSE: " + connection.getResponseCode());
            BufferedOutputStream responseWebsite = new BufferedOutputStream(
                new FileOutputStream("C:\\Temp\\response.html"));

            InputStream in = url.openStream(); // IMPORTANT TO READ PROPERLY DATA
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            StringBuilder result2 = new StringBuilder();
            String line;

            while ((line = reader.readLine()) != null) {
                responseWebsite.write(line.getBytes());
                result2.append(line + "\n");
            }

            responseWebsite.close();

Используя приведенный выше код, я отправляю запрос и получаю ответ HTML вместо XML. Что я делаю не так?

EDIT Я отредактировал пост, потому что мне нужно дать больше объяснений, я думаю. Моя проблема в том, что в Переменные 'reader', которые я получаю, являются HTML, а не XML. Я хочу XML.

EDIT2

Так что я не могу дать ссылку на репо, потому что это не я частный проект. Но когда я использую почтальон и отправляю запрос в конечную точку с

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:de.aeb.xnsg.emcs.bf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body><ns2:request>...

тело, которое я получаю с помощью приложения, которое я получаю

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:response>... 

И это хорошо. И ответ в почтальоне - чистый XML, который я хочу.

Но когда я, например, помещаю эту конечную точку в chrome, я получаю веб-сайт, на котором я могу найти другие конечные точки / wsdls для этой службы, но на другом языке (французский, немецкий и т. Д.).

РЕДАКТИРОВАТЬ 3 Решено

Моя проблема заключалась в том, что я указал Accept-Encoding

connection.setRequestProperty("Accept-Encoding", "gzip,deflate");

когда я удалил его, я смог прочитать правильный ответ из потока.

Но я также смог прочитать это сообщение с помощью GZIPInputStream, но не уверен, какое решение лучше.

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Не могли бы вы дать ссылку на репо? Или больше подробностей? Например, файл, что вы ожидаете, что вы получаете.

0 голосов
/ 03 июня 2019

Возможно проблема в этой строке new FileOutputStream("C:\\Temp\\response.html"));? И вам нужно изменить расширение на response.xml

...