まえがき
URLからデータをダウンロードするとき、サーバーの負荷等を考えてデータが新しい場合だけダウンロードしたいことがあります。HTTPプロトコルではHEADメソッドのリクエストに対するレスポンスヘッダーが日付やETagといった情報を持ち、これらを利用して前述の目的を達成できます。
これらの情報はGETメソッドのリクエストに対するレスポンスヘッダーにも含まれますが、GETメソッドはデータそのものを取得するのでサーバーの負荷等は軽減できません。
C#における実装
C#ではSystem.Net.Http
名前空間のHttpClient
クラスを使用してURLにHEADメソッドのリクエストを送信できます。以下にサンプルコードを示します。
using System;
using System.Net.Http;
namespace ConsoleApp1
{
class Program
{
// HttpClientのインスタンスは再利用すべきです。
// https://docs.microsoft.com/ja-jp/dotnet/api/system.net.http.httpclient?view=netcore-3.1#remarks
private static readonly HttpClient httpClient = new HttpClient();
static void Main()
{
// HTTPリクエストを送信するURL
// ここではQiitaのURLをお借りしています。
var url = "https://qiita.com/";
// URLに対するHTTP HEADリクエストメッセージを作成して送信
// ここではResultを呼び出して同期処理にしています。
var headMessage = new HttpRequestMessage(HttpMethod.Head, url);
var response = httpClient.SendAsync(headMessage).Result;
// ETagを出力する
// nullの可能性があります。
var headers = response.Headers;
Console.WriteLine($"ETag:{headers.ETag?.Tag}");
}
}
}
参考
HTTPヘッダーやETagについてはMDNを参照ください。