MiniAPI(三)：Response

MiniAPIでは、レスポンスの返却データには3つの形式があります。IResult、string、jsonです：
ValueTask<string> - これにはstringおよびTask<string>が含まれます
T（任意の他のタイプ、フロントエンドに返す際にjsonに変換されます）- これにはTask<T>およびValueTask<T>が含まれます
IResultに基づく - これにはTask<IResult>およびValueTask<IResult>が含まれます
1.文字列
文字列の返却は非常にシンプルです。結果を文字列に変換して返却するだけです。以下のようになります：
```csharp
app.MapGet("/hi", () => "Hellow Mini API");
```
返却結果
![alt 画像](https://mmbiz.qpic.cn/mmbiz_png/4CAA63nvHRCU1S6hCJ02GiaGeCsCmuYia9DYJouDeIwGmQs4323UibQL1qJyTfjNxIKuXrGZtSibEFGIjodM5Bg6fw/640?wx_fmt=png)
Content-Typeタイプ
![alt 画像](https://mmbiz.qpic.cn/mmbiz_png/4CAA63nvHRCU1S6hCJ02GiaGeCsCmuYia99Sn5WYLEIt3QJoFF6yrKicBqic32lgibibGrv6LlOOVz35Pnwj3Jz9mQ6A/640?wx_fmt=png)
2.Json
jsonも難しくありません。オブジェクトを返却するだけです
```csharp
app.MapGet("/answers/{questionid}", (int questionId, ExamContext exam) => exam.Answers.Where(s => s.QuestionId == questionId));
```
結果
![alt 画像](https://mmbiz.qpic.cn/mmbiz_png/4CAA63nvHRCU1S6hCJ02GiaGeCsCmuYia9LaeNl5EJUxCwRPK8o9ZPjubH4XsA0XiaD78q4hFdqpNQpg201jQpnHQ/640?wx_fmt=png)
Content-Type
![alt 画像](https://mmbiz.qpic.cn/mmbiz_png/4CAA63nvHRCU1S6hCJ02GiaGeCsCmuYia9bzXb88JquXYiciclMndfcCkPWdTAmrn76flicyjOLsznciaPZDBjkwLJvw/640?wx_fmt=png)
3.IResult
string、jsonに比べて、Resultははるかに豊かです。公式が提供するのは以下の通りです：
![alt 画像](https://mmbiz.qpic.cn/mmbiz_png/4CAA63nvHRCU1S6hCJ02GiaGeCsCmuYia9L1ibicCNJ5l5TRX1jcyHZvJiblhGG43I0mZcpSaw9QPpCJMgKISobeKgA/640?wx_fmt=png)
これにより、多くのシナリオに適応できます。例えば、認証のログインやログアウト、ファイルのダウンロード、リダイレクト（Redirect,LocalRedirect,RedirectToRoute）、さまざまなリターンステータスなどがあります。もちろん、Text,Jsonの返却も含まれます。
内蔵されたもの以外にも、結果を拡張することが可能です。yamlタイプの結果を返す例を見てみましょう。
拡張クラス（ここでYamlDotNetというサードパーティのライブラリを使ってオブジェクトをyaml文字列にシリアライズします）
```csharp
static class ResultsExtensions{
    public static IResult Yaml(this IResultExtensions resultExtensions, object yamlObject)
    {
        ArgumentNullException.ThrowIfNull(resultExtensions, nameof(resultExtensions));
        var serialzer = new YamlDotNet.Serialization.SerializerBuilder().Build();
        return new YamlResult(serialzer.Serialize(yamlObject));
    }
}

class YamlResult : IResult{
    private readonly string _yaml;
    public YamlResult(string yaml)
    {
        _yaml = yaml;
    }
    public Task ExecuteAsync(HttpContext httpContext)
    {
        httpContext.Response.ContentType = "yaml";
        httpContext.Response.ContentLength = Encoding.UTF8.GetByteCount(_yaml);
        return httpContext.Response.WriteAsync(_yaml);
    }
}
```
拡張クラスを使用する
```csharp
app.MapGet("/yaml/questions/{id}", (int id, ExamContext exam) =>   Results.Extensions.Yaml(exam.Questions.Where(s => s.Id == id).Include("Answers").Select(s => new   {
    s.Id,
    Question = s.Question1,
    s.Score,
    QuestionType = s.QuestionType.TypeName,
    SubjectType = s.SujectType.TypeName,
    Answers = s.Answers.Select(t => new { t.Id, Answer = t.Answer1 })
})));
```
結果
![alt 画像](https://mmbiz.qpic.cn/mmbiz_png/4CAA63nvHRCU1S6hCJ02GiaGeCsCmuYia9iaFln6RsHn4woWgCHPRWS93VsL3kBfNvJpb7liaCeosdm5XODS528mGg/640?wx_fmt=png)
content-type
![alt 画像](https://mmbiz.qpic.cn/mmbiz_png/4CAA63nvHRCU1S6hCJ02GiaGeCsCmuYia9eDYD36m20qwssjF9EfF4eCL5w6piaJvxs7hkp8ZhUJG6R4L7wicTnRiag/640?wx_fmt=png)
(Translated by GPT)

元のリンク：https://mp.weixin.qq.com/s?__biz=MzA3NDM1MzIyMQ==&mid=2247484799&idx=1&sn=131280b3344cc00b4f7ef1aaf7528f5c&chksm=9f005a55a877d3431a25d03799a3d996a59c8d21b907632f3947edbea56ceafe5f24eca397a3&token=2050451386&lang=zh_CN#rd