【问题标题】:How to get and process an XML Response after making an HTTP Request发出 HTTP 请求后如何获取和处理 XML 响应
【发布时间】:2019-08-08 21:47:16
【问题描述】:

我有一个迭代方法,它将对一个 url 进行 100 次调用,然后解析 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();
}

【问题讨论】:

  • 你得到的是 JSON。因此,服务器总是(或随机)发回 JSON,并且当内容类型标头(如果设置正确)指示响应包含 JSON 时,您需要使用 JSON 解析器而不是 XML 解析器,或者服务器实际上向您发送 JSON,因为您没有使用请求的 Accept 标头专门要求 XML。
  • 看起来您正在向其发出呼叫的服务器响应 JSON 或 XML,具体取决于...“无论感觉如何”。所以这可能根本与 SAX、XML 或 java 无关。只要服务器无缘无故地切换格式,您就会陷入尝试适应的困境。尽管如此:为什么服务器会切换格式?阅读它的 API 文档,也许……尝试在 http 请求中添加一个“Accept: application/xml”标头。这是表示您肯定希望在响应中包含 XML 的常用方式。
  • 服务器在 XML 和 JSON 响应之间随机选择的可能性很小,但是可以想象,同一 URL 后面的多个负载平衡服务器可能会以不同的方式配置,看起来可能相同。该服务很可能具有指定您想要的响应表单的方法。如果是这样,那么你应该使用它,如果你得到一个不同于请求格式的响应,你应该向服务器操作员报告一个错误。

标签: java xml web-services sax


【解决方案1】:

非常感谢,您完全正确。我需要向请求 URL 添加一个请求参数,指定我希望将数据作为 XML 返回。

奇怪的是响应变化如此之大,但现在固定了!

【讨论】:

    【解决方案2】:

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

    应该有帮助:) 或者尝试:

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

    【讨论】:

      猜你喜欢
      • 2020-02-24
      • 2011-02-23
      • 2013-06-22
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 2019-10-24
      • 2020-03-24
      相关资源
      最近更新 更多