2013-04-02 39 views
10

Tôi đang sử dụng HttpURLConnection để lấy một URL giống như rằng:HttpURLConnection Android: Xử lý HTTP chuyển hướng

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

bây giờ tôi muốn tìm hiểu xem đã có một chuyển hướng và nếu nó là một vĩnh viễn (301) hoặc tạm thời (302) một để cập nhật URL trong cơ sở dữ liệu trong trường hợp đầu tiên nhưng không phải trong trường hợp thứ hai.

Điều này có thể thực hiện được trong khi vẫn đang sử dụng xử lý chuyển hướng HttpURLConnection và nếu như thế nào?

+2

Câu hỏi thú vị. Tôi không nghĩ có cách nào tiêu chuẩn để xử lý việc này. Bạn sẽ phải đặt instanceFollowRedirects thành false và xử lý thủ công mã phản hồi. – Perception

Trả lời

9

Đơn giản chỉ cần gọi getUrl() trên URLConnection dụ sau khi gọi getInputStream():

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(); 

Nếu bạn cần phải biết liệu chuyển hướng xảy ra trước khi thực sự nhận được nội dung của nó, đây là đoạn code mẫu:

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

Với ví dụ mã đầu tiên của bạn, có cách nào để phân biệt giữa chuyển hướng tạm thời và vĩnh viễn không? Và ví dụ thứ hai của bạn lá chuyển hướng thực sự xử lý lên đến tôi mà tôi muốn tránh. – Julian

+0

Có lẽ là một cách để có được tất cả các chuyển hướng tạm thời, nhưng tôi không chắc chắn làm thế nào để đi về điều này. – syb0rg

+0

Chuyển hướng tạm thời và Chuyển hướng vĩnh viễn phải có các mã phản hồi khác nhau. 301 = Vĩnh viễn. 302 và đôi khi 307 là tạm thời. – 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; 
}