2011-10-17 3 views
2

자바 프로그램을 사용하여 짧은 URL에서 확장 된 URL을 가져옵니다. Java URLConnection을 사용하면 두 가지 방법 중 원하는 결과를 얻는 것이 더 낫습니다.전체 URL 주소를 가장 효율적으로 얻는 방법은 무엇입니까?

Connection.getHeaderField("Location"); 

Connection.getURL(); 

대 나는 그들 모두 동일한 출력을 제공 같아요. 첫 번째 방법은 나에게 최상의 결과를주지 못했지만 7 개 중 1 개만 해결되었습니다. 두 번째 방법으로 효율성을 높일 수 있습니까?

더 좋은 방법을 사용할 수 있습니까?

@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에서 불과 리디렉션 페이지를 다운로드되지 않습니다 :

+1

과 같은 라인을 따라 더 완벽한 방법을 포함 당신은 당신이 bit.ly 티니 URL 또는 같은 서비스에서 발생하는 뭔가를 의미합니까? – Kiril

+0

네, 정확하지만이 두 가지로 제한되지 않습니다. – R1234

답변

5

나는 다음을 사용하십시오.

한 가지 단점은 해결 된 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 

그것은 (http://stackoverflow.com/를 가리키는)는 Location 헤더와 301 Moved Permanently 응답을 보냅니다. 최신 브라우저는 위의 HTML 페이지를 표시하지 않습니다. 대신 그들은 자동으로 Location 헤더의 URL로 사용자를 리디렉션합니다. 당신이 "짧은 URL을"말할 때

+0

마지막 두 줄은 무엇을하고 있는지 설명해 주시겠습니까? 나머지 코드는 정확히 같습니다. – R1234

+0

또한 FollowRidirects를 true로 설정하면 성능에 큰 영향을 줍니까? – R1234

+0

그들은 [jUnit 단정 방법] (http://www.junit.org/apidocs/org/junit/Assert.html#assertEquals%28java.lang.Object,%20java.lang.Object%29)이며, 그들은 제 1 및 제 2 파라미터는 동일하거나 또는 동일하지 않다. 예제에서 그들은 동일합니다. 성능 :'instanceFollowRedirects'가'true' 인 경우'bit.ly'에서 페이지를 다운로드하고 두 번째 버전에서는'bit.ly'가 리디렉션됩니다 (이 예에서는'stackoverflow.com '). 'false'를 사용하면 한 페이지 만 다운로드하므로 더 적은 대역폭을 사용합니다. – palacsint