Minimal API - 自定义响应

94 阅读1分钟

为什么要自定义返回值

统一返回格式。
你也可以在返回时主动映射到固定类型,但是每次都需要写重复代码。

实现IResult

public record CustomOkDto<T>(int Code, string? Message, T Data);

public class CustomOkResult<T>(CustomOkDto<T> dto) : IResult
{
    private readonly CustomOkDto<T> dto = dto;

    public async Task ExecuteAsync(HttpContext httpContext)
    {
        httpContext.Request.ContentType = "application/json";
        httpContext.Response.StatusCode = 200;
        await httpContext.Response.WriteAsJsonAsync(
            dto,
            AppJsonSerializerContext.Default.Options.GetTypeInfo(typeof(CustomOkDto<T>))
        );
    }
}

public static class ResultsExtensions
{
    public static CustomOkResult<T> CustomOk<T>(
        this IResultExtensions extensions,
        CustomOkDto<T> dto
    )
    {
        ArgumentNullException.ThrowIfNull(extensions);
        return new CustomOkResult<T>(dto);
    }

    public static CustomOkResult<T> CustomOk<T>(
        this IResultExtensions extensions,
        T data,
        int code,
        string? message = default
    )
    {
        ArgumentNullException.ThrowIfNull(extensions);
        return new CustomOkResult<T>(new CustomOkDto<T>(code, message, data));
    }
}

使用

TypedResults.Extensions.CustomOk(0, new { Name = "xxx"});
TypedResults.Extensions.CustomOk(1000, null, "用户名或密码错误");

总结

  • 其实还是操作 HttpContext
  • 可以配合 枚举类 对返回数据报错类型进一步约束
  • 也考虑采用全局Filter实现自定义响应