2012-02-03 19 views
17

Tôi đang tạo trình thu thập dữ liệu và cần lấy dữ liệu từ luồng bất kể đó có phải là 200 hay không. CURL đang thực hiện nó, cũng như bất kỳ trình duyệt chuẩn nào.URLConnection không cho phép tôi truy cập dữ liệu trên các lỗi Http (404.500, v.v.)

Sau đây sẽ không thực sự nhận được nội dung của yêu cầu, mặc dù có một số, ngoại lệ được ném với mã trạng thái lỗi http. Tôi muốn đầu ra bất kể, có cách nào không? Tôi thích sử dụng thư viện này vì nó thực sự sẽ thực hiện các kết nối liên tục, điều này hoàn hảo cho loại thu thập dữ liệu mà tôi đang thực hiện.

package test; 

import java.net.*; 
import java.io.*; 

public class Test { 

    public static void main(String[] args) { 

     try { 

      URL url = new URL("http://github.com/XXXXXXXXXXXXXX"); 
      URLConnection connection = url.openConnection(); 

      DataInputStream inStream = new DataInputStream(connection.getInputStream()); 
      String inputLine; 

      while ((inputLine = inStream.readLine()) != null) { 
       System.out.println(inputLine); 
      } 
      inStream.close(); 
     } catch (MalformedURLException me) { 
      System.err.println("MalformedURLException: " + me); 
     } catch (IOException ioe) { 
      System.err.println("IOException: " + ioe); 
     } 
    } 
} 

Làm việc, nhờ: Đây là những gì tôi đã đưa ra - cũng giống như một bằng chứng sơ bộ khái niệm:

import java.net.*; 
import java.io.*; 

public class Test { 

    public static void main(String[] args) { 
//InputStream error = ((HttpURLConnection) connection).getErrorStream(); 

     URL url = null; 
     URLConnection connection = null; 
     String inputLine = ""; 

     try { 

      url = new URL("http://verelo.com/asdfrwdfgdg"); 
      connection = url.openConnection(); 

      DataInputStream inStream = new DataInputStream(connection.getInputStream()); 

      while ((inputLine = inStream.readLine()) != null) { 
       System.out.println(inputLine); 
      } 
      inStream.close(); 
     } catch (MalformedURLException me) { 
      System.err.println("MalformedURLException: " + me); 
     } catch (IOException ioe) { 
      System.err.println("IOException: " + ioe); 

      InputStream error = ((HttpURLConnection) connection).getErrorStream(); 

      try { 
       int data = error.read(); 
       while (data != -1) { 
        //do something with data... 
        //System.out.println(data); 
        inputLine = inputLine + (char)data; 
        data = error.read(); 
        //inputLine = inputLine + (char)data; 
       } 
       error.close(); 
      } catch (Exception ex) { 
       try { 
        if (error != null) { 
         error.close(); 
        } 
       } catch (Exception e) { 

       } 
      } 
     } 

     System.out.println(inputLine); 
    } 
} 

Trả lời

37

đơn giản:

URLConnection connection = url.openConnection(); 
InputStream is = connection.getInputStream(); 
if (connection instanceof HttpURLConnection) { 
    HttpURLConnection httpConn = (HttpURLConnection) connection; 
    int statusCode = httpConn.getResponseCode(); 
    if (statusCode != 200 /* or statusCode >= 200 && statusCode < 300 */) { 
    is = httpConn.getErrorStream(); 
    } 
} 

Bạn có thể tham khảo Javadoc cho lời giải thích . Cách tốt nhất tôi sẽ xử lý việc này là như sau:

URLConnection connection = url.openConnection(); 
InputStream is = null; 
try { 
    is = connection.getInputStream(); 
} catch (IOException ioe) { 
    if (connection instanceof HttpURLConnection) { 
     HttpURLConnection httpConn = (HttpURLConnection) connection; 
     int statusCode = httpConn.getResponseCode(); 
     if (statusCode != 200) { 
      is = httpConn.getErrorStream(); 
     } 
    } 
} 
+0

"InputStream is = connection.getResponseMessage();" Tôi không thấy phương thức getResponseMessage trong lớp URLConnection, nó là một phần của HttpUrlConnection, vì vậy chúng ta không nên định kiểu đó? Hoặc chúng ta có thể thay thế getResponseMessage bằng getInputStream, hoặc sẽ ném ngoại lệ? – David

+0

Đó là lỗi đánh máy, đó là 'connection.getInputStream()'. –

+0

Câu trả lời rất hay và ngắn –

8

Bạn cần thực hiện như sau sau khi gọi openConnection.

  1. Cast URLConnection để HttpURLConnection

  2. Gọi getResponseCode

  3. Nếu câu trả lời là một thành công, sử dụng getInputStream, nếu không sử dụng getErrorStream

(Bài kiểm tra cho sự thành công nên là 200 <= code < 300 vì có mã thành công HTTP hợp lệ ngoài 200.)


Tôi đang tạo trình thu thập thông tin và cần lấy dữ liệu từ luồng bất kể đó có phải là 200 hay không.

Chỉ cần lưu ý rằng nếu mã là 4xx hoặc 5xx thì dữ liệu "" có thể là trang lỗi thuộc loại nào đó.


Điểm cuối cùng mà nên được thực hiện là bạn nên luôn luôn tôn trọng "robots.txt" ... và đọc Điều khoản dịch vụ trước khi bò/cạo nội dung của một trang web có chủ sức quan tâm. Chỉ cần xóa các yêu cầu GET có thể làm phiền các chủ sở hữu trang web ... trừ khi bạn đã đến một số loại "sắp xếp" với chúng.

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