Чтение GZIP ответа на SOAP запрос
Я отправляю через SOAP post-запрос имеющий следующие свойства
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
В ответ приходит
Content-Type: text/xml; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Я пытался сделать так
URL url = new URL(addr);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("...... указываю все свойства, в них проблем нет
connection.setDoOutput(true);
PrintWriter pw = new PrintWriter(connection.getOutputStream());
pw.write(request);
pw.flush();
connection.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String output;
StringBuilder response = new StringBuilder();
while ((output = in.readLine()) != null) {
response.append(output);
}
in.close();
Ожидаемо что это не работает, ответ на это приходит вот такой
�iG#)�*��eVe]f@�흼��{���{���;�N'��
Ну и ответ приходит как xml в xml
B у эти xml похоже разная кодировка.
Как правильно принять ответ ?
Ответы (2 шт):
Автор решения: sanmai
→ Ссылка
Вам нужно разжать ответ:
Reader reader = null;
if ("gzip".equals(connection.getContentEncoding())) {
reader = new InputStreamReader(new GZIPInputStream(connection.getInputStream()));
} else {
reader = new InputStreamReader(connection.getInputStream());
}
И дальше будто никакого сжатия нет.
Автор решения: sevnight
→ Ссылка
Последующую проблему с парсингом вложенного CDATA xml решил. Привожу полный код
public static void main(String args[]) throws Exception {
String addr = "https://....123";
String request = "<soapenv:Authorization>\n" +
" 123213213213\n" +
"</soapenv:Envelope>";
URL url = new URL(addr);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Accept-Encoding", "gzip,deflate");
connection.setRequestProperty("Content-Length", String.valueOf(request.length()));
connection.setRequestProperty("Content-Type", "text/xml;charset=UTF-8");
connection.setRequestProperty("SOAPAction", "http://урл/Authorization");
connection.setRequestProperty("Host", "урл");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("User-Agent", "Apache-HttpClient/4.1.1 (java 1.5)");
connection.setDoOutput(true);
// Write XML
OutputStream outputStream = connection.getOutputStream();
byte[] b = request.getBytes("UTF-8");
outputStream.write(b);
outputStream.flush();
outputStream.close();
Reader reader = null;
if ("gzip".equals(connection.getContentEncoding())) {
reader = new InputStreamReader(new GZIPInputStream(connection.getInputStream()));
} else {
reader = new InputStreamReader(connection.getInputStream());
}
StringBuilder response = new StringBuilder();
while (true) {
int ch = reader.read();
if (ch == -1) {
break;
}
response.append((char) ch);
}
System.out.println(response);
Document doc = getXMLFromString(response.toString());
NodeList nodes = doc.getElementsByTagName("a:Response");
Element line = (Element) nodes.item(0);
System.out.println(getCharacterDataFromElement(line));
}
public static String getCharacterDataFromElement(Element e) {
Node child = e.getFirstChild();
if (child instanceof CharacterData) {
CharacterData cd = (CharacterData) child;
return cd.getData();
}
return "?";
}
public static Document getXMLFromString(String xml) throws Exception {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(xml)));
return doc;
}
