2013-02-27 41 views
6

tôi sử dụng mã Java sau đây trong một Bean để đọc nội dung của một URL:Java: Cách đọc nội dung từ các URL được chuyển hướng?

String url; 
String inputLine; 
StringBuilder srcCode=new StringBuilder(); 

public void setUrl (String value) { 
    url = value; 
} 

private void scanWebPage() throws IOException { 
    try { 
     URL dest = new URL(url); 
     URLConnection yc = dest.openConnection(); 
     yc.setUseCaches(false); 
     BufferedReader in = new BufferedReader(new 
         InputStreamReader(yc.getInputStream())); 
     while ((inputLine = in.readLine()) != null) 
      srcCode = srcCode.append (inputLine); 
     in.close(); 
    } catch (FileNotFoundException fne) { 
     srcCode.append("File Not Found") ; 
    } 
} 

Mã này hoạt động tốt cho hầu hết các URL, nhưng không làm việc cho URL chuyển hướng. Làm cách nào để cập nhật mã trên để đọc nội dung từ các URL được chuyển hướng? Đối với các URL được chuyển hướng, tôi nhận được "File Not Found".

+0

'java.net.URL' nên làm theo ← liên kết theo mặc định (trừ trường hợp trước đây bạn đã được gọi là' HttpURLConnection.setFollowRedirects (false) '), vì vậy bạn chỉ nên xem nội dung của URL mục tiêu cuối cùng. Giả sử tất nhiên chuyển hướng không tự đến trang 404 ... –

+2

Kết nối URL sẽ không theo chuyển hướng nếu giao thức thay đổi (tức là, từ HTTP sang HTTPS). Đây có phải là kịch bản của bạn không? Ngoài ra, bạn không được phép sử dụng [Apache HttpComponents] (http://hc.apache.org/)? – Perception

Trả lời

4

Give sau một đi:

HttpURLConnection yc = (HttpURLConnection) dest.openConnection(); 
    yc.setInstanceFollowRedirects(true); 

Trong bối cảnh để mã của bạn ở trên:

`String url = "http://java.sun.com"; 
    String inputLine; 
    StringBuilder srcCode=new StringBuilder(); 



    URL dest = new URL(url); 
    HttpURLConnection yc = (HttpURLConnection) dest.openConnection(); 
    yc.setInstanceFollowRedirects(true); 
    yc.setUseCaches(false); 

    BufferedReader in = new BufferedReader(
     new InputStreamReader(
      yc.getInputStream())); 
    while ((inputLine = in.readLine()) != null) { 
     srcCode = srcCode.append (inputLine); 
    } 

    in.close();` 

Modified hơn nữa để giúp bạn chẩn đoán những gì đang xảy ra. Mã này tắt tự động chuyển hướng và sau đó theo cách thủ công các tiêu đề Vị trí in ra khi nó đi cùng.

@Test 
public void f() throws IOException { 
    String url = "http://java.sun.com"; 


    fetchURL(url); 
} 


private HttpURLConnection fetchURL(String url) throws IOException { 
    URL dest = new URL(url); 
    HttpURLConnection yc = (HttpURLConnection) dest.openConnection(); 
    yc.setInstanceFollowRedirects(false); 
    yc.setUseCaches(false); 

    System.out.println("url = " + url); 

    int responseCode = yc.getResponseCode(); 
    if (responseCode >= 300 && responseCode < 400) { // brute force check, far too wide 
     return fetchURL(yc.getHeaderField("Location")); 
    } 

    System.out.println("yc.getResponseCode() = " + yc.getResponseCode()); 

    return yc; 
} 
+1

Chris - Cảm ơn, nhưng điều này không hiệu quả. Các url được chuyển hướng giống như "url nhỏ" được thay đổi thành url thực khi được nhập trong trình duyệt web, nhưng thông qua mã java, chúng không thay đổi và được gọi là url không hợp lệ. – user1492667

+0

URL mà bạn định truy cập là gì? Tôi đã thử nghiệm mã ở trên và thấy rằng mã đó tuân theo chuyển hướng cho url ở trên. Trong trường hợp của bạn là URL của bạn chuyển hướng đến một giao thức khác? Nếu vậy thì đó có lẽ là vấn đề của bạn khi HttpURLConnection sẽ không theo dõi chúng. Nếu đúng như vậy thì cá nhân tôi sẽ sử dụng một thư viện như một thư viện có trong Play2, hoặc Apache HttpCommons. Ngoài ra, bạn luôn có thể đặt tự động theo dõi thành sai và sau đó đọc chính tiêu đề Vị trí và sau đó tự tìm nạp URL đó. –

0

của nó không phải là debuggin của prog của bạn, nhưng bạn có thể xem xét việc này một

public class GetURLData 
{ 
    public static void main(String args[]) 
    { 
     String url = "the url you want the response from"; 
     HttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url); 
      HttpResponse response; 
      StringBuilder builder= new StringBuilder(); 
      try 
      { 
       response = httpClient.execute(httpPost); 
       BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 
       char[] buf = new char[8000]; 
       int l = 0; 
        while (l >= 0) 
        { 
         builder.append(buf, 0, l); 
         l = in.read(buf); 
        } 
       System.out.println(builder.toString); 
      } catch (Exception e) 
     { 
       System.out.println("Exception is :"+e); 
       e.printStackTrace(); 
      } 
    } 
} 
Các vấn đề liên quan