ASP.NET Core WebApi返回结果统一包装实践记录

ASP.NET Core WebApi返回结果统一包装实践记录

简介

在ASP.NET Core的WebApi中,我们经常需要对返回结果进行处理,比如统一进行数据包装,加上状态标识等。本文将对WebApi的结果统一包装进行详细阐述,同时给出两条示例。

实现方式

Step 1:新建WebApi项目

使用Visual Studio或者VS Code等工具创建ASP.NET Core WebApi项目。

Step 2:定义统一返回结果的类

定义一个名为ApiResponse的类,用于包装返回数据。

public class ApiResponse<TData>
{
    public ApiResponse(int statusCode, string errorMessage, TData data)
    {
        StatusCode = statusCode;
        ErrorMessage = errorMessage;
        Data = data;
    }

    public int StatusCode { get; set; }
    public string ErrorMessage { get; set; }
    public TData Data { get; set; }
}

Step 3:统一返回结果

在WebApi的Controller中,统一使用ApiResponse类对数据进行包装。其中,ApiResponse类中的StatusCode表示请求的状态码,ErrorMessage表示错误信息,Data则表示返回的数据。示例代码如下:

[HttpGet]
public async Task<ActionResult<ApiResponse<string>>> Get()
{
    var data = await _service.GetDataAsync();
    if (string.IsNullOrEmpty(data))
    {
        return NotFound(new ApiResponse<string>(404, "data not found", null));
    }
    return Ok(new ApiResponse<string>(200, null, data));
}

Step 4:全局处理返回结果

使用ASP.NET Core中的中间件,在全局统一处理返回结果。示例代码如下:

public class ApiResponseMiddleware
{
    private readonly RequestDelegate _next;

    public ApiResponseMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        var originalBody = context.Response.Body;
        using var memStream = new MemoryStream();
        context.Response.Body = memStream;

        try
        {
            await _next(context);
            if (context.Response.StatusCode == StatusCodes.Status200OK)
            {
                memStream.Position = 0;
                var responseReader = new StreamReader(memStream);
                var responseBody = await responseReader.ReadToEndAsync();

                // 将返回数据进行包装
                var data = JsonConvert.DeserializeObject(responseBody);
                var result = new ApiResponse<object>(context.Response.StatusCode, null, data);

                context.Response.ContentType = "application/json";
                context.Response.StatusCode = StatusCodes.Status200OK;
                await context.Response.WriteAsync(JsonConvert.SerializeObject(result));
            }
        }
        finally
        {
            context.Response.Body = originalBody;
        }
    }
}

Startup.cs中将中间件添加至管道。示例代码如下:

app.UseMiddleware<ApiResponseMiddleware>();

示例1:返回整形数据

[HttpGet("{id}")]
public async Task<ActionResult<ApiResponse<int>>> GetById(int id)
{
    var data = await _service.GetDataByIdAsync(id);
    if (data <= 0)
    {
        return NotFound(new ApiResponse<string>(404, "data not found", null));
    }
    return Ok(new ApiResponse<int>(200, null, data));
}

示例2:返回列表数据

[HttpGet]
public async Task<ActionResult<ApiResponse<List<string>>>> Get()
{
    var data = await _service.GetListAsync();
    if (data == null || data.Count == 0)
    {
        return NotFound(new ApiResponse<string>(404, "data not found", null));
    }
    return Ok(new ApiResponse<List<string>>(200, null, data));
}

结论

使用ASP.NET Core中的WebApi,对返回数据进行包装,可以统一返回格式,并且便于控制返回的状态。同时使用中间件,对返回结果进行全局处理,可以简化代码的编写,提高开发效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ASP.NET Core WebApi返回结果统一包装实践记录 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 2016 IBM云计算峰会前瞻 Doug Davis: IBM与Docker社区携手共进

    Doug Davis Doug Davis就职于IBM开源/标准部,致力于提升Docker及其他云原生技术,并将其集成至IBM云产品及服务中。在整个职业生涯中,他参与了很多有关其他开源项目及标准的工作,比如Cloud Foundry、Apache Axis、CIMI,以及大部分与SOAP相关的规范。在IBM与W3C、OASIS、DMTF等多家标准机构合作的过…

    云计算 2023年4月13日
    00
  • PyTorch中torch.utils.data.DataLoader实例详解

    PyTorch中torch.utils.data.DataLoader实例详解 介绍 在深度学习中,使用大量的数据进行模型的训练是必需的,但是对于包含大量数据集的任务来说,常规的数据输入(如读取整个数据集,并将其存储在内存中)通常会耗费大量的时间和空间。因此,数据加载的高效性至关重要。PyTorch提供了一个名为DataLoader的工具,可以快速且高效地处…

    云计算 2023年5月18日
    00
  • 浅谈javascript事件环微任务和宏任务队列原理

    下面是关于“浅谈javascript事件环微任务和宏任务队列原理”的完整攻略: 什么是事件循环? 事件循环是 JavaScript 的一种机制,它用于控制JavaScript代码的执行顺序,确保异步任务得到预期的执行结果,保证 JavaScript 是单线程的运行环境。 当执行JavaScript程序时,JavaScript引擎首先会将同步任务压入执行栈中,…

    云计算 2023年5月17日
    00
  • .Net Core中使用Quartz.Net实践记录

    下面我将为您详细讲解“.Net Core中使用Quartz.Net实践记录”的完整攻略。 什么是Quartz.Net Quartz.Net是一个开源的作业调度框架,可以用来实现定时任务、计划任务等。使用Quartz.Net可以实现复杂的任务调度,不仅可以在应用程序内部触发作业,还可以通过网络触发。 实现过程 这里我们将介绍如何在.Net Core中使用Qua…

    云计算 2023年5月17日
    00
  • 孟岩谈Erlang:并行计算和云计算

    ——写在《Erlang程序设计》出版之际 Erlang算不上是一种“大众流行”的程序设计语言,而且即使是Erlang的支持者,大多数也对于Erlang成为“主流语言”并不持乐观态度。然而,自从2006年以来,Erlang语言确实在国内外一批精英程序员中暗流涌动,光我所认识和听说的,就有不少于一打技术高手像着了魔一样迷上了这种已经有二十多年历史的老牌语言。这是…

    2023年4月10日
    00
  • Clusternet:一款开源的跨云多集群云原生管控利器!

    作者 徐迪,Clusternet 项目发起人,腾讯云容器技术专家。 摘要 Clusternet (Cluster Internet)是一个兼具多集群管理和跨集群应用编排的开源云原生管控平台,解决了跨云、跨地域、跨可用区的集群管理问题。 在项目规划阶段,就是面向未来混合云、分布式云和边缘计算等场景来设计的,支持海量集群的接入和管理、应用分发、流量治理(开发中)…

    云计算 2023年4月12日
    00
  • 阿里云EMR计算速度提升2.2倍 连续两年打破大数据领域最难竞赛世界纪录!

    4月26日,大数据领域权威竞赛TPC-DS公布了最新结果,阿里云作为全球唯一入选的云计算公司获得第一。值得一提的是,去年阿里云EMR首次打破该竞赛纪录,成为全球首个通过TPC认证的公共云产品。今年在这一基础上,EMR的计算速度提升了2.2倍,性能指标(QphDS)首次超过一千万分,是友商的商业大数据产品3.5倍。同时,E-MapReduce继续保持数据处理能…

    云计算 2023年4月13日
    00
  • Spring Boot项目中实现文件上传功能的示例

    下面是Spring Boot项目中实现文件上传功能的完整攻略。 1. 添加依赖 在pom.xml文件中添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</…

    云计算 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部