2009-09-04 40 views
64
String urlString = "http://www.nbc.com/Heroes/novels/downloads/Heroes_novel_001.pdf"; 
URL url = new URL(urlString); 
if(/* Url does not return 404 */) { 
    System.out.println("exists"); 
} else { 
    System.out.println("does not exists"); 
} 
urlString = "http://www.nbc.com/Heroes/novels/downloads/Heroes_novel_190.pdf"; 
url = new URL(urlString); 
if(/* Url does not return 404 */) { 
    System.out.println("exists"); 
} else { 
    System.out.println("does not exists"); 
} 

này nên inCách kiểm tra xem một URL có tồn tại hay trả lại 404 bằng Java không?

exists 
does not exists 

THI

public static String URL = "http://www.nbc.com/Heroes/novels/downloads/"; 

public static int getResponseCode(String urlString) throws MalformedURLException, IOException { 
    URL u = new URL(urlString); 
    HttpURLConnection huc = (HttpURLConnection) u.openConnection(); 
    huc.setRequestMethod("GET"); 
    huc.connect(); 
    return huc.getResponseCode(); 
} 

System.out.println(getResponseCode(URL + "Heroes_novel_001.pdf")); 
System.out.println(getResponseCode(URL + "Heroes_novel_190.pdf")); 
System.out.println(getResponseCode("http://www.example.com")); 
System.out.println(getResponseCode("http://www.example.com/junk"));   

Output

SOLUTION

Thêm dòng tiếp theo trước khi .connect() và đầu ra sẽ là 200, 404, 200, 404

huc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)"); 
+0

Tôi không thấy sự cố trong thử nghiệm của bạn. Trong trình duyệt của tôi, tôi không nhận được nội dung cho kết quả thứ hai, nhưng tôi không nhận được 404 –

+0

Trong thực tế, tôi xuất hiện để có được một trang HTML phần lớn trống –

+1

Trang web đó dường như cung cấp nội dung hợp lệ cho hầu hết mọi thứ. ví dụ. www.nbc.com/junk. Hãy thử với http://www.example.com/junk.html –

Trả lời

24

Sử dụng HttpUrlConnection bằng cách gọi openConnection() trên đối tượng URL của bạn.

getResponseCode() sẽ cung cấp cho bạn phản hồi HTTP sau khi bạn đọc từ kết nối.

ví dụ:

URL u = new URL("http://www.example.com/"); 
    HttpURLConnection huc = (HttpURLConnection)u.openConnection(); 
    huc.setRequestMethod("GET"); 
    huc.connect() ; 
    OutputStream os = huc.getOutputStream(); 
    int code = huc.getResponseCode(); 

(không kiểm tra)

+0

Tôi đã cập nhật mã của mình với thử nghiệm không thành công –

+2

Không hoạt động! –

12

Không có gì sai với mã của bạn là. Đó là NBC.com đang thực hiện các thủ thuật cho bạn. Khi NBC.com quyết định rằng trình duyệt của bạn không có khả năng hiển thị PDF, nó chỉ gửi lại một trang web bất kể bạn đang yêu cầu gì, ngay cả khi nó không tồn tại.

Bạn cần phải đánh lừa nó trở lại bằng cách nói với nó trình duyệt của bạn có khả năng, một cái gì đó như thế nào,

conn.setRequestProperty("User-Agent", 
    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.13) Gecko/2009073021 Firefox/3.0.13"); 
53

Bạn có thể muốn thêm

HttpURLConnection.setFollowRedirects(false); 
// note : or 
//  huc.setInstanceFollowRedirects(false) 

nếu bạn không muốn đi theo chuyển hướng (3XX)

Thay vì thực hiện "GET", "HEAD" là tất cả những gì bạn cần.

huc.setRequestMethod("HEAD"); 
return (huc.getResponseCode() == HttpURLConnection.HTTP_OK); 
+12

+1 cho HEAD, mọi người quên cách HTTP hoạt động mọi lúc và sau đó và tốt là một số người vẫn còn nhớ :) –

+0

Xử lý url HTTPS khó hơn? Phải quản lý chứng chỉ ... – Jayy

36

này làm việc cho tôi:

URL u = new URL ("http://www.example.com/"); 
HttpURLConnection huc = (HttpURLConnection) u.openConnection(); 
huc.setRequestMethod ("GET"); //OR huc.setRequestMethod ("HEAD"); 
huc.connect() ; 
int code = huc.getResponseCode() ; 
System.out.println(code); 

nhờ những lời đề nghị trên.

1

Dựa trên câu trả lời nhất định và thông tin trong câu hỏi, đây là mã bạn nên sử dụng:

public static boolean doesURLExist(URL url) throws IOException 
{ 
    // We want to check the current URL 
    HttpURLConnection.setFollowRedirects(false); 

    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); 

    // We don't need to get data 
    httpURLConnection.setRequestMethod("HEAD"); 

    // Some websites don't like programmatic access so pretend to be a browser 
    httpURLConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)"); 
    int responseCode = httpURLConnection.getResponseCode(); 

    // We only accept response code 200 
    return responseCode == HttpURLConnection.HTTP_OK; 
} 

Tất nhiên thử nghiệm và làm việc.

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