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

yizhihongxing

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日

相关文章

  • 云计算生产实习—-实习日志

    前言 第一天实习日志如下 第二天实习日志如下 第三天实习日志如下 第四天实习日志如下 第五天实习日志如下 第六天实习日志如下 第七天实习日志如下 第八天实习日志如下 第九天实习日志如下 第十天实习日志如下 第十一天实习日志如下 第十二天实习日志如下 0.前言 本来打算每天都写一个博客作为实习的日志,结果发现,因为自己的笔记本的性能问题,有些实验同学的笔记本可…

    云计算 2023年4月12日
    00
  • angular2中Http请求原理与用法详解

    Angular2中Http请求原理与用法详解 1. Http请求原理 Angular2中的Http请求是基于XMLHttpRequest API实现的,它使用了RxJS的Observable来处理异步请求的结果。在发送请求时,可以通过选项参数进行请求配置,例如设置请求方式、请求头等。在接收响应时,可以通过RxJS的操作符(map、filter、catch等)…

    云计算 2023年5月17日
    00
  • 大数据就业的三大方向和最热门十大岗位【推荐】

    “大数据就业的三大方向和最热门十大岗位【推荐】”攻略 一、大数据就业的三大方向 1. 数据分析师 数据分析师是最为常见的大数据方向之一,作为一名数据分析师,主要职责是负责数据的收集、分析、建模和解释等工作。如果你擅长使用数据分析工具,有更深入的统计学基础,并且善于将数据解读为业务结论,那么数据分析师是一个好的就业选择。 2. 大数据工程师 大数据工程师负责处…

    云计算 2023年5月18日
    00
  • ASP.NET Core奇淫技巧之动态WebApi的实现

    让我来详细讲解ASP.NET Core奇淫技巧之动态WebApi的实现完整攻略。 概述 ASP.NET Core是一个开源的跨平台Web框架,它支持.NET Core平台和.NET Framework平台。这里要讲解的是ASP.NET Core奇淫技巧之动态WebApi的实现。所谓动态WebApi,是指在运行时,根据客户端需求生成对应的WebApi,而不需要…

    云计算 2023年5月17日
    00
  • 超千个节点OpenStack私有云案例(1):CERN 5000+ 计算节点私有云

     CERN:欧洲核子研究组织 本文根据以下几篇文章整理而来: https://www.openstack.org/summit/tokyo-2015/videos/presentation/unveiling-cern-cloud-architecture https://www.mybookworld.info/view/lcl9u/cern-cloud-…

    云计算 2023年4月12日
    00
  • python读取与处理netcdf数据方式

    Python是一款广泛应用于科学计算和数据处理的脚本语言,而NetCDF则是一种用于存储和交换科学数据的文件格式,主要应用于气象、海洋、地球物理和天文学等领域。 Python读取和处理NetCDF数据的方式主要基于两个库:netCDF4和xarray。其中,netCDF4是用于读写NetCDF文件的Python接口,而xarray则是建立于netCDF4之上…

    云计算 2023年5月18日
    00
  • 基于google earth engine 云计算平台的全国水体变化研究

        第一个博客密码忘记了,今天才来开通第二个博客,时间已经过去两年了,三年的硕士生涯,真的是感慨良多,最有收获的一段时光,莫过于在实验室一个人敲着代码了,研三来得到中科院深圳先进院,在这里开始了新的研究生涯,主要工作是基于google earth engine的云计算平台,遥感大数据运算,不得不说,这是一个超越国内遥感行业至少10年的东西,我记得有一个院…

    云计算 2023年4月11日
    00
  • Python基于多线程操作数据库相关问题分析

    Python基于多线程操作数据库相关问题分析 在进行 Python 多线程操作数据库时,需要注意以下几个问题: 数据库连接 在多线程情况下,不同线程操作数据的时候需要使用独立的数据库连接,否则可能会出现一些不可预测的错误。因此,在多线程操作数据库之前,需要优先创建多个独立的数据库连接。 线程安全 MySQL 库的使用是单线程安全的,因此在多线程操作数据库时,…

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