JavaにURLが存在するかどうかの確認
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方式をサポートしていますが、
5. 次のリダイレクト
最後に、URLの存在を探すときは、リダイレクトに従わないことをお勧めします。 ただし、これはURLを探している理由にも依存する可能性があります。
URLが移動されると、サーバーは3xx応答コードを持つ新しいURLにリクエストをリダイレクトできます。 デフォルトでは、リダイレクトに従います。 必要に応じて、リダイレクトに従うか無視するかを選択できます。
これを行うには、すべてのHttpURLConnectionのfollowRedirectsのデフォルト値をオーバーライドできます。
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プロジェクトで入手できます。