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日

相关文章

  • 记Asp.Net Core Swagger使用并带域接口处理的方法

    下面是关于“记Asp.Net Core Swagger使用并带域接口处理的方法”的完整攻略,包含两个示例说明。 简介 Swagger是一种流行的API文档工具,可以帮助开发人员快速创建和测试API接口。在Asp.Net Core应用程序中,可以使用Swagger来生成API文档,并使用域接口处理来处理API请求。本文将详细讲解如何在Asp.Net Core应…

    云计算 2023年5月16日
    00
  • 云计算初探

      云计算这个词已经火的一塌糊涂,不懂云计算好像就不是搞IT的,可是谁又能说得清什么是云计算了? 先看两个概念: 美国国家标准与技术研究院:云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 进而可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很…

    云计算 2023年4月12日
    00
  • C#基于Linq和反射实现数据持久化框架Xml4DB详解

    下面是关于“C#基于Linq和反射实现数据持久化框架Xml4DB详解”的完整攻略,包含两个示例说明。 简介 Xml4DB是一个基于Linq和反射实现的数据持久化框架,可以将对象序列化为XML格式并保存到文件中。在本攻略中,我们将介绍如何使用Xml4DB框架来实现数据持久化,包括创建数据模型、保存数据、读取数据等步骤。 步骤 在使用Xml4DB框架进行数据持久…

    云计算 2023年5月16日
    00
  • ES的索引结构与算法解析

    作者:京东物流 李洪吉 提到ES,大多数爱好者想到的都是搜索引擎,但是明确一点,ES不等同于搜索引擎。不管是谷歌、百度、必应、搜狗为代表的自然语言处理(NLP)、爬虫、网页处理、大数据处理的全文搜索引擎,还是有明确搜索目的的搜索行为,如各大电商网站、OA、站内搜索、视频网站的垂直搜索引擎,他们或多或少都使用到了ES。 ​作为搜索引擎的一部分,ES自然具有速度…

    云计算 2023年4月25日
    00
  • 基于python实现微信好友数据分析(简单)

    基于Python实现微信好友数据分析 简介 本攻略将介绍如何基于Python实现微信好友数据分析,包括获取微信好友数据、数据清洗、数据分析等步骤。 步骤 1. 获取微信好友数据 首先需要安装ItChat,可以通过pip安装,在终端输入以下指令: pip install itchat 如果需要安装指定版本,可以使用以下指令: pip install itcha…

    云计算 2023年5月18日
    00
  • 云计算,大数据,人工智能三者有何关系?

    原创:http://cloud.idcquan.com/yjs/115806.shtml 云计算最初的目标是对资源的管理,管理的主要是计算资源,网络资源,存储资源三个方面。想象你有一大堆的服务器,交换机,存储设备,放在你的机房里面,你最想做的事情就是把这些东西统一的管理起来,最好能达到当别人向你请求分配资源的时候(例如1核1G内存,10G硬盘,1M带宽的机器…

    云计算 2023年4月12日
    00
  • 云计算基础-0

    记录学习云计算的笔记,主要是学习阿里云上的几个主要云产品 基础 云分类 共有云:所有人都可以访问的 私有云:私人使用的(通过内网实现) 混合云:公有云和私有云混合使用(不重要的数据放公有云,重要数据放私有云,中间通过隧道技术连接) 云计算的服务模式 IAAS:只提供单个基础设备,比如买一个云服务器(裸机) PAAS:提供基础设备并带一些服务,比如买一台云服务…

    2023年4月9日
    00
  • 【速记】阿里巴巴集团董事局主席马云主题演讲速记

    【速记】阿里巴巴集团董事局主席马云主题演讲速记 什么是速记? 速记是将演讲者说的话用特殊符号快速记录下来的技巧。 速记的步骤 准备工作:将演讲主题、演讲者信息、场地设备等做好准备。 熟悉符号:掌握需要用到的速记符号,包括各种缩略符号、数字、箭头等。 注意力集中:将注意力集中在演讲者的言语表达、语速、语气和重点词汇等方面。 使用构图法:将速记符号通过特殊的构图…

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