おーみんブログ

C#, ASP.NET Core, Unityが大好きです。

ASP.NET Core WebAPIでCSVとJson出力を切り替えるサンプル。

はじめに

ASP.NET Core WebAPIでCSVJsonの両方の出力が切り替えるサンプルを作ってみました。 今回は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で返却されます。 applicationjson.png

text/csvの場合

こちらの場合は"Download file"というリンクが出力されるのでこちらをクリックするとCSVファイルがダウンロードされます。 textcsv.png

おわりに

それにしても改めて思うのが都度適切な型を返却してくれるIActionResultやActionResultは便利だなぁ~と。