2013-04-02 23 views
10

Ben sadece böyle bir URL almak için HttpURLConnection kullanıyorum yönlendiriyor:Android HttpURLConnection: Kulp HTTP

URL url = new URL(address); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setInstanceFollowRedirects(true); 
// ... 

Şimdi bir yönlendirme olmadığını öğrenmek istiyorum ve kullanılabilir Eğer kalıcı (301) ya da İlk durumda veritabanındaki URL'yi güncellemek için ikinci (ikinci) değil geçici (302) bir.

Bu, hala HttpURLConnection yönlendirme işlemlerini kullanırken mümkün mü ve nasıl yapılır?

+2

İlginç bir soru. Bunu halletmenin standart bir yolu olduğunu sanmıyorum. ResponseFollowRedirects'i yanlış ve el ile yanıt kodunu işlemek zorundasınız. – Perception

cevap

9

Basitçe getInputStream() çağrıldıktan sonra URLConnection örneğinde getUrl() çağırır:

URLConnection con = new URL(url).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(); 

Eğer yönlendirme aslında burada, içeriğini var örnek kod almadan önce oldu olmadığını bilmek gerekiyorsa:

HttpURLConnection con = (HttpURLConnection) (new URL(url).openConnection()); 
con.setInstanceFollowRedirects(false); 
con.connect(); 
int responseCode = con.getResponseCode(); 
System.out.println(responseCode); 
String location = con.getHeaderField("Location"); 
System.out.println(location); 
+0

İlk kod örneğinizle, geçici ve kalıcı bir yönlendirme arasında ayrım yapmanın bir yolu var mı? Ve ikinci örneğiniz, kaçınmak istediğim gerçek yönlendirme işlemlerini bırakıyor. – Julian

+0

Muhtemelen tüm geçici yönlendirmeleri almanın bir yolu var, ancak bu konuda nasıl gideceğimi bilmiyorum. – syb0rg

+0

Geçici yönlendirmeler ve Kalıcı yönlendirmeler farklı yanıt kodlarına sahip olmalıdır. 301 = Kalıcı. 302 ve bazen 307 geçici. – Keab42

0
private HttpURLConnection openConnection(String url) throws IOException { 
    HttpURLConnection connection; 
    boolean redirected; 
    do { 
     connection = (HttpURLConnection) new URL(url).openConnection(); 
     int code = connection.getResponseCode(); 
     redirected = code == HTTP_MOVED_PERM || code == HTTP_MOVED_TEMP || code == HTTP_SEE_OTHER; 
     if (redirected) { 
      url = connection.getHeaderField("Location"); 
      connection.disconnect(); 
     } 
    } while (redirected); 
    return connection; 
}