2012-10-13 37 views
6

Khi sử dụng URLConnection, chuyển hướng 301 không hoạt động, thậm chí không hiển thị tiêu đề Location, sử dụng getHeaderFields(). Nó là một danh sách trống, ngoại trừ trong Android mới hơn (tôi đã thử nghiệm 4.1 và nó hoạt động). Dường như một cái gì đó này đã được báo cáo trong trình duyệt mặc định here là tốt, mặc dù trong thử nghiệm của tôi nó làm việc trong trình duyệt Android. Có cách giải quyết nào cho lỗi này trong Android cũ hơn không?301/302 Chuyển hướng không hoạt động trong Android (hoạt động khác trong các phiên bản khác nhau)

tôi đã cố gắng:

URLConnection conn = u.openConnection(); 
HttpURLConnection conn = (HttpURLConnection) u.openConnection(); 
(conn).setInstanceFollowRedirects(true); 

nhưng nó vẫn trả về một danh sách rỗng, ngoại trừ trong Android mới hơn.

Cập nhật: Có thể có vấn đề liên quan, đôi khi URLConnection thậm chí không gửi yêu cầu trong một số trường hợp. (Tôi đã kiểm tra với Wireshark trên một máy tính với giả lập). Có cách nào để khắc phục lỗi này không?

Cập nhật: Tôi đã thử kiểm tra chuyển hướng 3xx, chuyển hướng hoạt động tốt, nhưng các liên kết thông thường không hoạt động với Trình quản lý cookie của Ian. Sau khi thực hiện bảo setCookies được gọi trực tiếp sau khi openConnection, nó hoạt động tuyệt vời:

 URL u = new URL(_url); 
     ... 
     int tries = 4; 
     int code = 301; 
     URLConnection conn = null; 
     while (tries > 0 && code/100 == 3) { 
      conn = null; 
      conn = u.openConnection(); 
      _CM.setCookies(conn); 
      ((HttpURLConnection)conn).setInstanceFollowRedirects(false);//Required 
      code =((HttpURLConnection)conn).getResponseCode(); 
      if (code/100 == 3) { 
       String loc = conn.getHeaderField("Location"); 
       u = new URL(loc); 
      } 
     } 

     //conn.addRequestProperty("Accept-Encoding", "gzip"); 

     conn.connect(); 
     _CM.storeCookies(conn); 

Điều thực sự kỳ lạ là, đối với Android mới hơn (4.1 giả lập) dòng FollowRedirect (nhận xét "Yêu cầu") là không cần thiết. Trên Android cũ hơn (2.2), nó cung cấp lỗi Connection Reset by Peer. Đây có lẽ là lý do mã thử nghiệm chuyển hướng của tôi bị lỗi trên phiên bản 2.2, không phải là 4.1. Bất kỳ lý do nào cho sự khác biệt về chức năng? Theo comments here, chuyển hướng https dường như có hành vi khác nhau tùy thuộc vào phiên bản JVM, có thể là URLConnection/HTTPUrlConnection của Android đã thay đổi trong các phiên bản khác nhau không?

+0

Bạn nói yêu cầu HTTP đôi khi không đến được máy chủ, mã phản hồi HTTP 'conn.getResponseCode(); 'khi chuyển hướng không xảy ra là gì? – yorkw

+0

Phương thức getResponseCode() không xác định đối với loại URLConnection – NoBugs

+1

Sử dụng 'HttpURLConnection.getResponseCode();' khi xử lý vấn đề liên quan đến http, tôi sẽ luôn nhận và kiểm tra mã phản hồi thực tế trước khi thực hiện thêm bất kỳ điều gì. – yorkw

Trả lời

2

Không chắc về URLConnection, nhưng tôi biết rằng HttpClient tôn chuyển hướng và chúng ta sử dụng nó tất cả các cách trở lại Android 2,1

http://developer.android.com/reference/org/apache/http/client/HttpClient.html

(Dựa trên commons apache HttpClient)

+0

Tôi đã sử dụng nó trên một vấn đề trước đó do một giới hạn của UrlConnection, tôi không muốn viết lại tất cả mặc dù. – NoBugs

+0

Ứng dụng có hỗ trợ https không? bánh quy? – NoBugs

+0

Tôi không biết những gì nó không hỗ trợ;) – pawelzieba

Các vấn đề liên quan