7

我正在尝试通过 Java 中的 URL 获取 HTML。但这301 Moved Permanently就是我所拥有的一切。另一个 URL 工作。怎么了?这是我的代码:

 hh= new URL("http://hh.ru");
        in = new BufferedReader(
                new InputStreamReader(hh.openStream()));


        while ((inputLine = in.readLine()) != null) {

            sb.append(inputLine).append("\n");
            str=sb.toString();//returns 301


        }
4

6 回答 6

18

您正面临重定向到其他 URL。这很正常,网站可能有很多理由重定向您。只需遵循基于“位置”HTTP 标头的重定向,如下所示:

URL hh= new URL("http://hh.ru");
URLConnection connection = hh.openConnection();
String redirect = connection.getHeaderField("Location");
if (redirect != null){
    connection = new URL(redirect).openConnection();
}
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
System.out.println();
while ((inputLine = in.readLine()) != null) {
    System.out.println(inputLine);
}

您的浏览器会自动跟踪重定向,但使用 URLConnection 您应该自己进行。如果它困扰您,请查看其他Java HTTP 客户端实现,例如 Apache HTTP 客户端。他们中的大多数都能够自动跟随重定向。

于 2013-08-25T17:05:22.947 回答
2

由于可能有多个重定向(例如 307 然后 301),发现这个答案很有用并且有所改进。

URLConnection urlConnection = url.openConnection();
                String redirect = urlConnection.getHeaderField("Location");
                for (int i = 0; i < MAX_REDIRECTS ; i++) {
                    if (redirect != null) {
                        urlConnection = new URL(redirect).openConnection();
                        redirect = urlConnection.getHeaderField("Location");
                    } else {
                        break;
                    }
                }
于 2015-12-03T08:44:44.167 回答
1

你的代码没有问题。该消息意味着hh.ru永久移动到另一个域。

于 2013-08-25T17:02:10.397 回答
0

我测试了你的代码,没问题,但是当我使用“hh.ru”时,和你的问题一样,当我使用 lynx(命令行浏览器)连接到“hh.ru”时,它会告诉我它正在重定向到另一个 url,然后告诉我它已被永久移动,然后出现此警报:
“警报!:此客户端不包含对 HTTPS URL 的支持”

于 2013-08-25T17:10:21.783 回答
0

当我将特定文件放在服务器上运行时,我解决了我的问题。而不是http://hh.ru,我使用http://hh.ru/index.php. 它对我有用

于 2018-01-08T08:19:29.570 回答
0

检查提供的 URL 是 HTTP 还是 HTTPS,考虑添加协议是您只使用域名,如http(s)://domainname.com/resource-name

阅读:https ://en.wikipedia.org/wiki/HTTP_301

于 2019-01-04T17:58:15.327 回答