【C#】Web APIを呼び出してみた

概要

コンソールアプリから「天気予報API」を叩き、東京の天気予報を取得します。

環境

  • Windows10
  • .Net6

インストール

Web API クライアントライブラリ

パッケージマネージャーコンソールで次のコマンドを実行しインストールを行います。

Install-Package Microsoft.AspNet.WebApi.Client
パッケージマネージャーコンソールの呼び出し

呼び出し

リソース取得用のモデルクラスを作成

入れ子になっているJSONにも対応できるように、複数のクラスを用います。

public class Weather
{
	public string publicTimeFormatted { get; set; }
	public Description description { get; set; }
	public List<Forecasts> forecasts { get; set; }
}

public class Description
{
	public string publicTimeFormatted { get; set; }
	public string bodyText { get; set; }
}

public class Forecasts
{
	public string date { get; set; }
	public string dateLabel { get; set; }
	public string telop { get; set; }
	public Detail detail { get; set; }
}

public class Detail
{
	public string weather { get; set; }
	public string wind { get; set; }
	public string wave { get; set; }
}

HttpClientの作成

HttpClient は 毎回新しいソケットを開かなくて良いように、インスタンスを static 変数で持っておき、オブジェクトを使いまわすよう実装しています。

詳細は「公式ドキュメント」を参照してください。

static HttpClient client = new HttpClient();
static async Task RunAsync()
{
	//HTTP 要求のベース URI を設定します。
	client.BaseAddress = new Uri(baseURL);
	client.DefaultRequestHeaders.Accept.Clear();

	//JSON形式でデータを送信する
	client.DefaultRequestHeaders.Accept.Add(
		new MediaTypeWithQualityHeaderValue("application/json"));

	try
	{
		var tokyoCd = 130010;

		// GetAsync メソッドは HTTP GET 要求を送信します。
		var weather = await GetWeatherAsync(baseURL + $"/city/{tokyoCd}");

		// 取得結果の表示
		Console.WriteLine(weather.title);
		Console.WriteLine($"明日({weather.forecasts[1].date})の天気は{weather.forecasts[1].telop}です。");
		Console.WriteLine($"風速 {weather.forecasts[1].detail.wave}");
		Console.WriteLine($"{weather.forecasts[1].detail.wind}になるでしょう。");
		Console.WriteLine($"予報発生時刻: {weather.publicTimeFormatted}");
	}
	catch (Exception ex)
	{
		Console.WriteLine(ex.Message);
	}
	Console.ReadLine();
}

GET要求を送信し、リソースを取得

GetAsync メソッドが完了した場合、HTTP 応答を含む HttpResponseMessage が返却され、成功コードの場合、天気予報の情報がJSONとして格納されます。

ReadAsAsyncを呼び出し、デシリアライズを行います。

static async Task<Weather> GetWeatherAsync(string path)
{
	Weather weather = null;

	HttpResponseMessage response = await client.GetAsync(path);
	if (response.IsSuccessStatusCode)
	{
		weather = await response.Content.ReadAsAsync<Weather>();
	}
	return weather;
}

// MAIN
static void Main(string[] args)
{
	RunAsync().GetAwaiter().GetResult();
}

参考資料

タイトルとURLをコピーしました