如何从SOAP端点接收xml响应?

时间:2019-06-03 12:53:38

标签: java xml soap httpurlconnection

我的问题是我有一个终结点URL,如果将其放入浏览器,则可以看到该网站。当我在邮递员程序中使用具有正确请求(xml)的端点时,我收到xml响应。这就是我想要的。但是我试图在我的Java应用程序中收到相同的响应,但是我收到的是website(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。我做错了什么?

编辑 我编辑了帖子,因为我想提供更多解释。我的问题是 我收到的“阅读器”变量字节是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时,我正在访问一个网站,在该网站上可以找到该服务的其他端点/ wsdl,但使用其他语言(法语,德语等)。

编辑3 解决了

我的问题是我指定了接受编码

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

当我删除它时,我可以从流中读取正确的响应。

但是我也可以通过使用GZIPInputStream读取此消息,但不确定哪种解决方案更好。

2 个答案:

答案 0 :(得分:0)

问题也许在new FileOutputStream("C:\\Temp\\response.html"));这一行吗?您应该将扩展名更改为response.xml

答案 1 :(得分:0)

您能给回购一些链接吗?还是更多细节?例如,文件您所期望的内容。