当前位置: 首页 > news >正文

ASP.NET Core Webapi 返回数据的三种方式

ASP.NET Core为Web API控制器方法返回类型提供了如下几个选择:

  • Specific type

  • IActionResult

  • ActionResult<T>

1. 返回指定类型(Specific type)

        最简单的API会返回原生的或者复杂的数据类型(比如,string 或者自定义对象类型)。考虑如下的Action方法,其返回了一个自定义的Author对象的集合。

[HttpGet]
public List<Author> Get() =>
    _repository.GetAuthors();
    
[HttpGet]
public IEnumerable<Author> Get()
{
   return _repository.GetAuthors();

        从 NetCore 3.0 开始,你不仅可以定义同步形式的 IEnumerable<Author>方法,也可以定义异步形式的 IAsyncEnumerable<T>方法,不同点在于后者是一个异步模式的集合,好处就是不会导致同步迭代,既不阻塞数据库,也不阻塞主线程。

下面的代码展示了如何改造 Get 方法,两个方法返回都是不阻塞的:
[HttpGet]
public IEnumerable<Author> Get()
{
    var authors = _repository.GetAuthors();// 需要等待authors全部查询完成,才会进入下一步迭代,但是返回时又做了一个判断筛选,返回是不阻塞的
    foreach (var author in authors) // 适合数据库量大时,只做全部查询,然后通过foreach筛选,yield迭代返回
    {
        if(author.isMale){
             yield return author;
        } 
    }
}

[HttpGet]
public async IAsyncEnumerable<Author> Get() //异步迭代,既不会阻塞数据库,也不阻塞主线程
{
   var authors = GetAuthorsAsync(); // 使用GetAuthorsAsync异步方法,不用authors查询完毕,就会进入下一步迭代返回authors
   await foreach (var author in authors)
   {
        yield return author;
   }

2. 返回 IActionResult 实例

        如果你要返回 data + httpcode 的双重需求,那么 IActionResult 就是你要找的东西,下面的代码片段展示了如何去实现。

[HttpGet]
public IActionResult Get()
{
  if (authors == null)
      return NotFound("No records");

  return Ok(authors); // 必须有Ok等方法包装
}

        上面的代码有 Ok,NotFound 两个方法,对应着 OKResult,NotFoundResult, Http Code 对应着 200,404。当然还有其他的如:CreatedResult, NoContentResult, BadRequestResult, UnauthorizedResult, 和 UnsupportedMediaTypeResult,都是 IActionResult 的子类。

3. 返回 ActionResult<T> 实例

   ActionResult<T>包装了前面这种模式:可以返回 IActionResult(data + httpcode),也可以返回指定类型T

[HttpGet]
public ActionResult<IEnumerable<Author>> Get()
{
  if (authors == null)
       return NotFound("No records");
   return authors;
}

        和之前IActionResult的 Get 方法相比,这里如果不需要返回httpCode,则直接返回 authors ,而不需要再用 OK(authors) 包装,是一个非常好的简化,而IActionResult必须要使用Ok等包装一下返回。

接下来再把 Get 方法异步化:
[HttpGet]
public async Task<ActionResult<IEnumerable<Author>>> Get()
{
   var data = await GetAuthors();
   if (data == null)
        return NotFound("No record");
   return data;
}

        如果你有一些定制化需求,可以实现一个自定义的 ActionResult 类,做法就是实现 IActionResult 中的 ExecuteResultAsync 方法即可。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

http://www.lryc.cn/news/484335.html

相关文章:

  • SQL面试题——蚂蚁SQL面试题 连续3天减少碳排放量不低于100的用户
  • Python酷库之旅-第三方库Pandas(216)
  • 论文解析:计算能力资源的可信共享:利益驱动的异构网络服务提供机制
  • Spring AOP技术
  • 数字IC实践项目(10)—基于System Verilog的DDR4 Model/Tb 及基础Verification IP的设计与验证(付费项目)
  • MATLAB保存多帧图形为视频格式
  • redis7.x源码分析:(3) dict字典
  • 连续九届EI稳定|江苏科技大学主办
  • HarmonyOS NEXT应用开发实战 ( 应用的签名、打包上架,各种证书详解)
  • 【CICD】CICD 持续集成与持续交付在测试中的应用
  • Dolby TrueHD和Dolby Digital Plus (E-AC-3)编码介绍
  • 数字频率计的设计-- 基于 HDL 方法
  • [程序员] 没有产生core文件的原因
  • 【数字图像处理+MATLAB】基于 Sobel 算子计算图像梯度并进行边缘增强:使用 imgradientxy 函数
  • P10901 [蓝桥杯 2024 省 C] 封闭图形个数
  • ubuntu-desktop-24.04上手指南(更新阿里源、安装ssh、安装chrome、设置固定IP、安装搜狗输入法)
  • 手机直连卫星NTN通信初步研究
  • 蓝桥杯c++算法学习【2】之搜索与查找(九宫格、穿越雷区、迷宫与陷阱、扫地机器人:::非常典型的必刷例题!!!)
  • Android加载pdf
  • IOT物联网低代码可视化大屏解决方案汇总
  • Python的面向对象day7
  • 计算机网络(11)和流量控制补充
  • Rust 所有权机制
  • Pwn VM writeup
  • LSTM(长短期记忆网络)详解
  • 机器学习 贝叶斯公式
  • Scala-注释、标识符、变量与常量-用法详解
  • 大数据学习14之Scala面向对象--至简原则
  • docker 安装之 windows安装
  • JS 实现游戏流畅移动与按键立即响应