1. 概要

このチュートリアルでは、GETおよびHEAD HTTPメソッドを使用して、Javaの例でURLが存在するかどうかを確認する方法を見ていきます。

2. URLの存在

プログラミングでは、リソースにアクセスする前に、指定されたURLにリソースが存在するかどうかを知る必要がある場合や、URLをチェックしてリソースの状態を知る必要がある場合があります。

URLでのリソースの存在は、その応答コードを見て判断します。 通常、 200を探します。これは、「OK」を意味し、リクエストが成功したことを意味します。

3. GETリクエストの使用

まず、 GET リクエストを作成するために、 java.net.URL のインスタンスを作成し、アクセスするURLをコンストラクター引数として渡すことができます。 その後、接続を開いて応答コードを取得します。

URL url = new URL("http://www.example.com");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
 
int responseCode = huc.getResponseCode();
 
Assert.assertEquals(HttpURLConnection.HTTP_OK, responseCode);

URLでリソースが見つからない場合、404応答コードを取得します。

URL url = new URL("http://www.example.com/xyz"); 
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
 
int responseCode = huc.getResponseCode();
 
Assert.assertEquals(HttpURLConnection.HTTP_NOT_FOUND, responseCode);

HttpURLConnectionのデフォルトのHTTPメソッドはGETであるため、このセクションの例ではリクエストメソッドを設定していません。 次のセクションで、デフォルトのメソッドをオーバーライドする方法を説明します。

4. HEADリクエストの使用 

HEADは、応答本文を返さないことを除いてGETと同じHTTP要求メソッドでもあります。 

GETメソッドで同じリソースが要求された場合に受け取る応答ヘッダーとともに応答コードを取得します。

HEADリクエストを作成するには、レスポンスコードを取得する前に、リクエストメソッドをHEADに設定するだけです。

URL url = new URL("http://www.example.com");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
huc.setRequestMethod("HEAD");
 
int responseCode = huc.getResponseCode();
 
Assert.assertEquals(HttpURLConnection.HTTP_OK, responseCode);

同様に、リソースがURLで見つからない場合:

URL url = new URL("http://www.example.com/xyz");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
huc.setRequestMethod("HEAD");
 
int responseCode = huc.getResponseCode();
 
Assert.assertEquals(HttpURLConnection.HTTP_NOT_FOUND, responseCode);

HEADメソッドを使用して応答本文をダウンロードしないことにより、応答時間と帯域幅を削減し、パフォーマンスを向上させます

最近のほとんどのサーバーはHEAD方式をサポートしていますが、 一部の自社製またはレガシーサーバーは、無効なメソッドタイプエラーでHEADメソッドを拒否する場合があります。 したがって、HEADメソッドは注意して使用する必要があります。

5. 次のリダイレクト

最後に、URLの存在を探すときは、リダイレクトに従わないことをお勧めします。 ただし、これはURLを探している理由にも依存する可能性があります。

URLが移動されると、サーバーは3xx応答コードを持つ新しいURLにリクエストをリダイレクトできます。 デフォルトでは、リダイレクトに従います。 必要に応じて、リダイレクトに従うか無視するかを選択できます。

これを行うには、すべてのHttpURLConnectionfollowRedirectsのデフォルト値をオーバーライドできます。

URL url = new URL("http://www.example.com");
HttpURLConnection.setFollowRedirects(false);
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
 
int responseCode = huc.getResponseCode();
 
Assert.assertEquals(HttpURLConnection.HTTP_OK, responseCode);

または、 setInstanceFollowRedirects()メソッドを使用して、単一接続の次のリダイレクトを無効にすることができます。

URL url = new URL("http://www.example.com");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
huc.setInstanceFollowRedirects(false);
 
int responseCode = huc.getResponseCode();
 
Assert.assertEquals(HttpURLConnection.HTTP_OK, responseCode);

6. 結論

この記事では、応答コードをチェックしてURLが利用可能かどうかを確認しました。 また、HEADメソッドを使用して帯域幅を節約し、応答を高速化することをお勧めします。

このチュートリアルで使用されているコード例は、GitHubプロジェクトで入手できます。