У меня есть итеративный метод, который будет делать сотни обращений к URL, а затем анализировать XML-ответ и сохранять данные после каждого вызова.
Чтобы добиться этого, я пытался просто использовать HttpURLConnection, чтобы получить ответ, преобразовать его в строку, а затем в документ, чтобы я мог обработать его и проанализировать нужные теги / информацию с помощью SAX.
Однако этот метод работает только иногда, в результате я получаю следующее исключение:
org.xml.sax.SAXParseException: Content is not allowed in prolog.
Проблема заключается в том, что строка XML не всегда возвращается правильно. Вместо получения обычного XML-тега с данными между ними, например:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> </xml>
Я получаю что-то вроде этого:
{"created":"2019-03-18T13:19:41.484Z","count":3654,"offset":500 ....
Строка содержит данные, которые мне нужны, но по какой-то причине кажется, что ответ не всегда возвращает его в нужной мне форме. Я подтвердил, что это проблема с перебоями, то есть я получил один и тот же точный запрос, иногда получал желаемый ответ, а у других получал нежелательный ответ.
Метод, который делает запрос
URL url = new URL("Some URL");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
int responseCode = connection.getResponseCode();
if (responseCode != 200) {
log.error("Received an invalid response: " + responseCode);
return;
}
parseXml(convertResponseToXmlString(connection));
connection.disconnect();
Метод, который преобразует ответ в строку
private String convertResponseToXmlString(final HttpURLConnection connection) throws IOException
{
String inputLine;
BufferedReader input = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuffer content = new StringBuffer();
while ((inputLine = input.readLine()) != null)
{
content.append(inputLine);
}
input.close();
return content.toString().trim();
}