2009-09-04 9 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"); 
} 

これは、印刷する必要URLが存在するかどうか、またはJavaで404が返されるかどうかをチェックする方法は?

exists 
does not exists 

TEST

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

出力

404.connect()および出力は200、404、200になる前に

SOLUTION

は、あなたのURLオブジェクトにopenConnection()を呼び出すことによって

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

テストで問題が表示されません。私のブラウザでは、2番目の結果のコンテンツは得られませんが、私は404を取得しません –

+0

実際には、ほとんど空のHTMLページが表示されます –

+1

そのウェブサイトはほとんどのコンテンツに有効なコンテンツを提供するようです。例えばwww.nbc.com/junk。 http://www.example.com/junk.html –

答えて

24

404使用HttpUrlConnection、次の行を追加します。

getResponseCode()は、接続から読み込んだ後にHTTP応答を提供します。

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

(テストしていません)

+0

失敗したテストで自分のコードを更新しました –

+2

動作していません! –

12

あなたのコードは何も問題はありません。 NBC.comがあなたのトリックをしています。あなたのブラウザがPDFを表示することができないとNBC.comが判断した場合、あなたが要求しているものに関係なく、存在しない場合でもWebページを返信するだけです。

あなたは(あなたがリダイレクトに従うことをしたくない場合は

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

を追加することもでき

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

、お使いのブラウザが可能であるようなものを、それを伝えることで、それをバックトリックする必要があります3XX)

"GET"を実行する代わりに、 "HEAD"だけで十分です。

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

+1はHEADのために、人々は今や毎時どのようにHTTPが動作するかを忘れてしまい、一部の人々はまだ覚えているのが良いです:) –

+0

HTTPS URLを扱うのはもっと難しいですか??証明書を管理する必要があります... – Jayy

36

これは私の仕事:上記の提案のための

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

感謝を。

1

問題の与えられた答えとの情報に基づいて、これはあなたが使用する必要があるコードです:もちろんテストし、働くことの

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; 
} 

関連する問題