Как получить и обработать XML-ответ после выполнения HTTP-запроса - PullRequest
0 голосов
/ 18 марта 2019

У меня есть итеративный метод, который будет делать сотни обращений к 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();
}

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

connection.setRequestProperty("Content-Type", "application/xml");

должно помочь :) или попробуйте:

connection.setRequestProperty("Accept", "application/xml");

0 голосов
/ 18 марта 2019

Большое спасибо, вы совершенно правы.Мне нужно было добавить параметр запроса к URL-адресу запроса, в котором указано, что я хочу, чтобы данные возвращались в виде XML.

Странно, что ответ менялся таким образом, но теперь он исправлен!

...