URLがJavaに存在するかどうかを確認する

1. 概要

このチュートリアルでは、_GET_および_HEAD_ link:/java-http-request[HTTPメソッド]を使用して、Javaの例でURLが存在するかどうかを確認する方法を見ていきます。

2. URLの存在

プログラミングでは、アクセスする前に特定のURLにリソースが存在するかどうかを知る必要がある場合や、リソースの状態を知るためにURLを確認する必要がある場合があります。
応答コードを見て、URLでのリソースの存在を判断します。 通常*私たちは_200_を探します。これは「OK」であり、リクエストが成功したことを意味します。

3. GETリクエストを使用する

まず、_GET_リクエストを作成するには、_java.net.URL_のインスタンスを作成し、アクセスするURLをコンストラクター引数として渡すことができます。 その後、単純に接続を開き、応答コードを取得します。
URL url = new URL("https://www.example.com");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();

int responseCode = huc.getResponseCode();

Assert.assertEquals(HttpURLConnection.HTTP_OK, responseCode);
リソースがURLで見つからない場合、_404_応答コードを取得します。
URL url = new URL("https://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リクエストを作成するには、レスポンスコードを取得する前に、RequestメソッドをHEADに設定するだけです。
URL url = new URL("https://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("https://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にリダイレクトできます。 *デフォルトでは、リダイレクトに従います*。 必要に応じて、リダイレクトに従うか無視するかを選択できます。
これを行うには、すべての__HttpURLConnection__sの_followRedirects_のデフォルト値をオーバーライドできます。
URL url = new URL("https://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("https://www.example.com");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
huc.setInstanceFollowRedirects(false);

int responseCode = huc.getResponseCode();

Assert.assertEquals(HttpURLConnection.HTTP_OK, responseCode);

6. 結論

この記事では、応答コードをチェックしてURLが利用可能かどうかを調べました。 また、HEADメソッドを使用して帯域幅を節約し、より迅速な応答を取得することをお勧めします。
このチュートリアルで使用されるコード例は、https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-networking-2 [GitHubプロジェクト]で入手できます。