1. 程式人生 > 其它 >.NET6之MiniAPI(三):Response

.NET6之MiniAPI(三):Response

  MiniAPI中,Response的返回資料有三種格式,IResult,string,json:

  • ValueTask<string> - 這包括 string 和 Task<string>

  • T(任何其他型別,返回前端時轉成json)- 這包括 Task<T> 和 ValueTask<T>

  • 基於 IResult - 這包括 Task<IResult> 和 ValueTask<IResult>


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型別的例子。

擴充套件類(這裡引入了一個三方的物件序列化ymal字串的庫YamlDotNet)

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 })
   }))
);

結果

 content-type

 想要更快更方便的瞭解相關知識,可以關注微信公眾號