【问题标题】:java URLConnection to http URL and extracting XML responsejava URLConnection 到 http URL 并提取 XML 响应
【发布时间】:2016-04-22 15:34:11
【问题描述】:

我有一个休息 http URL,我必须从中提取 XML 响应。当我使用浏览器浏览 URL 时,它会返回 html 内容。我的代码也看到相同的 html 内容而不是 XML 内容。

有没有办法获取 XML 内容而不是 html 内容?在下面的代码中,我只得到 html 响应。但是,如果我检查 chrome 中的邮递员插件,它会显示一个很好的 XML 响应。如何使用我的代码获得相同的响应。

public static void sendURL(String urlValue)throws Exception{
    URL oracle = new URL("https://whois.arin.net/rest/asn/AS2639");

    URLConnection yc = oracle.openConnection();

    yc.setRequestProperty("content-type", "application/xml");
    BufferedReader in = new BufferedReader(new InputStreamReader(
                                yc.getInputStream()));
    String inputLine;
    while ((inputLine = in.readLine()) != null) 
        System.out.println(inputLine);
    in.close();
}

【问题讨论】:

    标签: java xml rest


    【解决方案1】:

    尝试替换这个:

    yc.setRequestProperty("content-type", "application/xml");
    

    用这个:

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

    确实主要目的完全不同,Content-Type 描述了您在请求正文中拥有的内容,而Accept 向服务器表明客户端可以管理什么样的内容,您想要做什么。

    内容类型:

    请求正文的 MIME 类型(用于 POST 和 PUT 请求)

    接受:

    响应可接受的内容类型。

    【讨论】:

    • 感谢您的回答。我也做了同样的工作。希望你能清楚地理解我的问题。
    【解决方案2】:

    所以你已经有了一个流。接下来需要做的是将该流传递给可以解码和解析 XML 的库。试试https://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/DocumentBuilder.html#parse(org.xml.sax.InputSource)

    更新

    抱歉,您最初的问题不是很清楚。如果您对 HTTP 请求的 Java 调用产生了 HTML,而您想要的是 XML 响应,那么您通过浏览器和通过 Java 发出的 HTTP 请求之间肯定存在一些差异。您可以使用 TCPMON 之类的工具在后端和 Java 程序之间捕获原始 HTTP 请求,然后将其与您通过浏览器发出的请求进行比较。

    由于 HTTP 是一个请求/响应对,等效的 HTTP 请求应始终发送回相同的响应。

    【讨论】:

    • 实际上我的流返回的是html而不是xml。我在 html 响应的任何地方都没有看到 xml 响应
    • 哦,对了,抱歉你的问题不是很清楚。如果您的浏览器调用发送 XML 而您的请求发送回 HTML,您应该检查原始 HTTP 请求并比较它们。您应该能够找到缺少的内容。
    【解决方案3】:

    我找到了答案。更新了代码。我们只需要接受 xml 响应。

    public static void sendURL(String urlValue)throws Exception{
        URL oracle = new URL("https://whois.arin.net/rest/asn/AS2639");
    
        URLConnection yc = oracle.openConnection();
    
        yc.setRequestProperty("accept", "application/xml");
    
        BufferedReader in = new BufferedReader(new InputStreamReader(
                                    yc.getInputStream()));
        String inputLine;
        while ((inputLine = in.readLine()) != null) 
            System.out.println(inputLine);
        in.close();
    }
    

    【讨论】:

    • 是的,我更新的答案告诉你为什么会这样。您的请求中缺少 HTTP Accept 标头是问题所在,您可以使用 TCPMON 之类的工具找到它。
    • 我不会做 tcpmon 的东西,我会搜索 java 文档来找到我的答案。另外,我仍然相信我的问题非常清楚
    • 我以为我在您发布之前发布了它,或者至少在发布我的答案之前我没有看到您发布。不幸的是,我不知道谁先发帖
    • 没问题。拿着。我仍然相信我的代码可以解释一切。我不想一路写下去。
    • @nicolas 谢谢。我会坚持我的回复,让你成为最好的!
    猜你喜欢
    • 1970-01-01
    • 2013-07-01
    • 2011-05-15
    • 1970-01-01
    • 2023-03-28
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多