MiniAPIでは、レスポンスの返却データには3つの形式があります。IResult、string、jsonです:
ValueTask - これにはstringおよびTaskが含まれます
T(任意の他のタイプ、フロントエンドに返す際にjsonに変換されます)- これにはTaskおよびValueTaskが含まれます
IResultに基づく - これにはTaskおよびValueTaskが含まれます
1.文字列
文字列の返却は非常にシンプルです。結果を文字列に変換して返却するだけです。以下のようになります:
app.MapGet("/hi", () => "Hellow Mini API");
返却結果
Content-Typeタイプ
2.Json
jsonも難しくありません。オブジェクトを返却するだけです
app.MapGet("/answers/{questionid}", (int questionId, ExamContext exam) => exam.Answers.Where(s => s.QuestionId == questionId));
結果
Content-Type
3.IResult
string、jsonに比べて、Resultははるかに豊かです。公式が提供するのは以下の通りです:
これにより、多くのシナリオに適応できます。例えば、認証のログインやログアウト、ファイルのダウンロード、リダイレクト(Redirect,LocalRedirect,RedirectToRoute)、さまざまなリターンステータスなどがあります。もちろん、Text,Jsonの返却も含まれます。
内蔵されたもの以外にも、結果を拡張することが可能です。yamlタイプの結果を返す例を見てみましょう。
拡張クラス(ここでYamlDotNetというサードパーティのライブラリを使ってオブジェクトをyaml文字列にシリアライズします)
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);
}
}
拡張クラスを使用する
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 })
})));