2013-02-19 10 views
7

Mam URL, który przekierowuje do innej url.I chcą być w stanie uzyskać ostateczną przekierowany kod URL.My:java URLConnection uzyskać ostateczną przekierowany URL

public class testURLConnection 
    { 
    public static void main(String[] args) throws MalformedURLException, IOException { 

    HttpURLConnection con =(HttpURLConnection) new URL("http://tinyurl.com/KindleWireless").openConnection(); 

    System.out.println("orignal url: " + con.getURL()); 
    con.connect(); 

System.out.println("connected url: " + con.getURL()); 
InputStream is = con.getInputStream(); 
System.out.println("redirected url: " + con.getURL()); 
is.close(); 

} }

It zawsze podaje oryginalny adres URL, natomiast adres redirectURL to: http://www.amazon.com/Kindle-Wireless-Reading-Display-Globally/dp/B003FSUDM4/ref=amb_link_353259562_2?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-10&pf_rd_r=11EYKTN682A79T370AM3&pf_rd_t=201&pf_rd_p=1270985982&pf_rd_i=B002Y27P3M.

Jak mogę uzyskać ten końcowy przekierowany adres URL.

Oto co próbowałem z pętli aż otrzymamy redirects.Still doesent pobrać żądany URL:

public static String fetchRedirectURL(String url) throws IOException 
    { 
HttpURLConnection con =(HttpURLConnection) new URL(url).openConnection(); 
//System.out.println("orignal url: " + con.getURL()); 
con.setInstanceFollowRedirects(false); 
con.connect(); 


InputStream is = con.getInputStream(); 
if(con.getResponseCode()==301) 
    return con.getHeaderField("Location"); 
else return null; 
    } 
    public static void main(String[] args) throws MalformedURLException, IOException { 
String url="http://tinyurl.com/KindleWireless"; 
String fetchedUrl=fetchRedirectURL(url); 
System.out.println("FetchedURL is:"+fetchedUrl); 
while(fetchedUrl!=null) 
{ url=fetchedUrl; 
System.out.println("The url is:"+url); 
    fetchedUrl=fetchRedirectURL(url); 


} 
System.out.println(url); 

    } 
+0

@ SJuan76 niespodzianka Niespodzianka - Nie otrzymuję ten sam problem na moim komputerze - MacOSX .. Dostaję wartość przekierowanie ....... .......... adres URL: http://tinyurl.com/KindleWireless połączony adres URL: http://tinyurl.com/KindleWireless przekierowany adres URL: http://www.amazon.com/Kindle -Keyboard-Free-Wi-Fi-Display/dp/B004HZYA6E – user1428716

+0

, ale otrzymany adres przekierowania nie jest końcowym adresem URL. Jest to adres URL tego pliku. Jeśli wkleisz miniaturkę w przeglądarce, otrzymasz końcowy URL: http : //www.ama zon.com/Kindle-Wireless-Reading-Display-Globally/dp/B003FSUDM4/ref=amb_link_353259562_2?pf_rd_m = ATVPDKIKX0DER & pf_rd_s = center-10 & pf_rd_r = 11EYKTN682A79T370AM3 & pf_rd_t = 201 & pf_rd_p = 1270985982 & pf_rd_i = B002Y27P3M – Jeets

+0

@Jeets mieć u uzyskać odpowiedzi na swoje question.because jestem stoi sam problem .. – dipali

Odpowiedz

2

Moim pierwszym pomysłem byłoby ustawienie instanceFollowRedirects false, lub za pomocą URLConnection zamiast.

W obu przypadkach przekierowanie nie zostanie wykonane, więc otrzymasz odpowiedź na pierwotne żądanie. Uzyskaj wartość statusu HTTP, a jeśli ma wartość 3xx, uzyskaj nową wartość przekierowania.

Oczywiście może istnieć łańcuch przekierowań, więc prawdopodobnie będziesz chciał iterować, aż dotrzesz do prawdziwej strony (status 2xx).

+0

próbowałem tego, ale wciąż doza daje poprawne url.I edytowane i dodane co próbowałem zgodnie z sugestią w oryginalnym poście – Jeets

1

@ user719950 na moim MAC-OSX - to rozwiązuje problem ściętego URL http:

do oryginalnego kodu, wystarczy dodać to poniżej linii: // Trzeba znaleźć za pośrednictwem przeglądarki, co jest Request Header IE/Chrome wysyła. I nadal nie mają wyjaśnienie, dlaczego ta prosta ustawienie powoduje prawidłowy adres URL :)

HttpURLConnection con =(HttpURLConnection) new URL 
("http://tinyurl.com/KindleWireless").openConnection(); 
con.setInstanceFollowRedirects(true); 
con.setDoOutput(true); 
    System.out.println("orignal url: " + con.getURL());  
     **con.setRequestProperty("User-Agent", 
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) 
    AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 
    Safari/536.26.17");**     

      con.connect(); 
    System.out.println("connected url: " + con.getURL()); 
    Thread.currentThread().sleep(2000l); 
    InputStream is = con.getInputStream(); 
    System.out.println("redirected url: " + con.getURL()); 

    is.close(); 
1

To może pomóc

public static void main(String[] args) throws MalformedURLException, 
    IOException { 

HttpURLConnection con = (HttpURLConnection) new URL(
     "http://tinyurl.com/KindleWireless").openConnection(proxy); 
    System.out.println("orignal url: " + con.getURL()); 
    con.connect(); 
    con.setInstanceFollowRedirects(false); 
    int responseCode = con.getResponseCode(); 
    if ((responseCode/100) == 3) { 
     String newLocationHeader = con.getHeaderField("Location"); 
     responseCode = con.getResponseCode(); 
     System.out.println("Redirected Location " + newLocationHeader); 
     System.out.println(responseCode); 
    } 

} 
3
public static String getFinalRedirectedUrl(String url) { 

    HttpURLConnection connection; 
    String finalUrl = url; 
    try { 
     do { 
      connection = (HttpURLConnection) new URL(finalUrl) 
        .openConnection(); 
      connection.setInstanceFollowRedirects(false); 
      connection.setUseCaches(false); 
      connection.setRequestMethod("GET"); 
      connection.connect(); 
      int responseCode = connection.getResponseCode(); 
      if (responseCode >= 300 && responseCode < 400) { 
       String redirectedUrl = connection.getHeaderField("Location"); 
       if (null == redirectedUrl) 
        break; 
       finalUrl = redirectedUrl; 
       System.out.println("redirected url: " + finalUrl); 
      } else 
       break; 
     } while (connection.getResponseCode() != HttpURLConnection.HTTP_OK); 
     connection.disconnect(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return finalUrl; 
} 
+0

Kod, który napisałem powyżej, wydrukuje wszystkie przekierowane adresy URL. – aasha

0

@JEETS Twoja funkcja fetchRedirectURL może nie działać, ponieważ istnieje różnorodność kodów HTTP dla przekierowań. Zmień go na kontrolę zasięgu i będzie działać.

public static String fetchRedirectURL(String url) throws IOException 
    { 
HttpURLConnection con =(HttpURLConnection) new URL(url).openConnection(); 
//System.out.println("orignal url: " + con.getURL()); 
con.setInstanceFollowRedirects(false); 
con.connect(); 

InputStream is = con.getInputStream(); 
if(con.getResponseCode()>=300 && con.getResponseCode() <400) 
    return con.getHeaderField("Location"); 
else return null; 
    } 
0

To idzie rekurencyjnie w przypadku istnieje wiele przekierowań:

protected String getDirectUrl(String link) { 
    String resultUrl = link; 
    HttpURLConnection connection = null; 
    try { 
     connection = (HttpURLConnection) new URL(link).openConnection(); 
     connection.setInstanceFollowRedirects(false); 
     connection.connect(); 
     int responseCode = connection.getResponseCode(); 
     if (responseCode == HttpURLConnection.HTTP_MOVED_PERM || responseCode == HttpURLConnection.HTTP_MOVED_TEMP) { 
      String locationUrl = connection.getHeaderField("Location"); 

      if (locationUrl != null && locationUrl.trim().length() > 0) { 
       IOUtils.close(connection); 
       resultUrl = getDirectUrl(locationUrl); 
      } 
     } 
    } catch (Exception e) { 
     log("error getDirectUrl", e); 
    } finally { 
     IOUtils.close(connection); 
    } 
    return resultUrl; 
} 
12

spróbować, ja używając rekurencyjnie do korzystania z wielu przekierowania URL.

public static String getFinalURL(String url) throws IOException { 
    HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection(); 
    con.setInstanceFollowRedirects(false); 
    con.connect(); 
    con.getInputStream(); 

    if (con.getResponseCode() == HttpURLConnection.HTTP_MOVED_PERM || con.getResponseCode() == HttpURLConnection.HTTP_MOVED_TEMP) { 
     String redirectUrl = con.getHeaderField("Location"); 
     return getFinalURL(redirectUrl); 
    } 
    return url; 
} 

i przy użyciu:

public static void main(String[] args) throws MalformedURLException, IOException { 
    String fetchedUrl = getFinalURL("<your_url_here>"); 
    System.out.println("FetchedURL is:" + fetchedUrl); 

} 
Powiązane problemy