Как получить полный URL-адрес наиболее эффективно? - PullRequest
2 голосов
/ 17 октября 2011

Я использую Java-программу для получения расширенных URL-адресов из коротких URL-адресов. Учитывая Java URLConnection, среди двух подходов, какой из них лучше получить желаемый результат?

Connection.getHeaderField("Location");

против

Connection.getURL();

Полагаю, они оба дают одинаковый вывод. Первый подход не дал мне лучших результатов, только 1 из 7 был решен. Можно ли повысить эффективность с помощью второго подхода?

Можем ли мы использовать любой другой лучший подход?

Ответы [ 2 ]

5 голосов
/ 17 октября 2011

Я бы использовал следующее:

@Test
public void testLocation() throws Exception {
    final String link = "http://bit.ly/4Agih5";

    final URL url = new URL(link);
    final HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
    urlConnection.setInstanceFollowRedirects(false);

    final String location = urlConnection.getHeaderField("location");
    assertEquals("http://stackoverflow.com/", location);
    assertEquals(link, urlConnection.getURL().toString());
}

При setInstanceFollowRedirects(false) HttpURLConnection не следует перенаправлениям, и страница назначения (stackoverflow.com в приведенном выше примере) не будет загружена, только страница перенаправления с bit.ly.

Один недостаток заключается в том, что когда разрешенный bit.ly URL-адрес указывает на другой короткий URL-адрес, например на tinyurl.com, вы получите ссылку tinyurl.com, а не то, на что перенаправляет tinyurl.com.

Редактировать

Чтобы увидеть ответ bit.ly, используйте curl:

$ curl --dump-header /tmp/headers http://bit.ly/4Agih5
<html>
<head>
<title>bit.ly</title>
</head>
<body>
<a href="http://stackoverflow.com/">moved here</a>
</body>
</html>

Как видите, bit.ly отправляет только короткую страницу перенаправления. Затем проверьте заголовки HTTP:

$ cat /tmp/headers
HTTP/1.0 301 Moved Permanently
Server: nginx
Date: Wed, 06 Nov 2013 08:48:59 GMT
Content-Type: text/html; charset=utf-8
Cache-Control: private; max-age=90
Location: http://stackoverflow.com/
Mime-Version: 1.0
Content-Length: 117
X-Cache: MISS from cam
X-Cache-Lookup: MISS from cam:3128
Via: 1.1 cam:3128 (squid/2.7.STABLE7)
Connection: close

Отправляет ответ 301 Moved Permanently с заголовком Location (который указывает на http://stackoverflow.com/). Современные браузеры не показывают HTML-страницу выше. Вместо этого они автоматически перенаправляют вас на URL в заголовке Location.

2 голосов
/ 12 мая 2012

Приведенная выше ссылка содержит более полный метод в той же строке, что и предыдущий пост https://github.com/cpdomina/WebUtils/blob/master/src/net/cpdomina/webutils/URLUnshortener.java

...