ASP.NET Core WebAPIでCSVとJson出力を切り替えるサンプル。
はじめに
ASP.NET Core WebAPIでCSVとJsonの両方の出力が切り替えるサンプルを作ってみました。 今回はMediaTypeの値でcsvファイルとJsonの切り替えが行われるようにしています。
サンプルコード
プロジェクトはASP.NET Core WebAPIテンプレートを利用しています。 WeatherForecastController.csファイル以外はデフォルトのまま特に変えていません。
[Produces("application/json", "text/csv")] [HttpGet] public ActionResult<IEnumerable<WeatherForecast>> Get() { //リクエストで渡ってきたAcceptヘッダーの値を取得 HttpContext.Request.Headers.TryGetValue("Accept", out var acceptValue); var rng = new Random(); if (acceptValue.ToString() == "text/csv") { using (var memory = new MemoryStream()) using (var writer = new StreamWriter(memory)) using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { var weatherForecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateTime.Now.AddDays(index), TemperatureC = rng.Next(-20, 55), Summary = Summaries[rng.Next(Summaries.Length)] }).ToList(); csv.WriteRecords(weatherForecasts); writer.Flush(); return File(memory.ToArray(), "text/csv", "Test.csv"); } } return Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateTime.Now.AddDays(index), TemperatureC = rng.Next(-20, 55), Summary = Summaries[rng.Next(Summaries.Length)] }).ToList(); }
ProducesAttributeを用いて選択できるMediaTypeを「application/json」と「text/csv」に絞っています。
戻り値はCSVファイルも返せるようにActionResult\<IEnumerable\
application/jsonの場合
こちらの場合はそのままJsonで返却されます。
text/csvの場合
こちらの場合は"Download file"というリンクが出力されるのでこちらをクリックするとCSVファイルがダウンロードされます。
おわりに
それにしても改めて思うのが都度適切な型を返却してくれるIActionResultやActionResultは便利だなぁ~と。