详解如何在ASP.NET Core Web API中以三种方式返回数据
更新时间:2021年01月24日 16:13:41 作者:一线码农
这篇文章主要介绍了详解如何在ASP.NET Core Web API中以三种方式返回数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
在 ASP.NET Core 中有三种返回 数据 和 HTTP状态码 的方式,最简单的就是直接返回指定的类型实例,如下代码所示:
[ApiController]
[Route(“[controller]”)]
public class WeatherForecastController : ControllerBase
{
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
除了这种,也可以返回 IActionResult 实例 和 ActionResult <T> 实例。
虽然返回指定的类型 是最简单粗暴的,但它只能返回数据,附带不了http状态码,而 IActionResult 实例可以将 数据 + Http状态码 一同带给前端,最后就是 ActionResult<T> 它封装了前面两者,可以实现两种模式的自由切换,🐂吧。
接下来一起讨论下如何在 ASP.NET Core Web API 中使用这三种方式。
创建 Controller 和 Model 类
在项目的 Models 文件夹下新建一个 Author 类,代码如下:
public class Author
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
有了这个 Author 类,接下来创建一个 DefaultController 类。
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
namespace IDGCoreWebAPI.Controllers
{
[Route(“api/[controller]”)]
[ApiController]
public class DefaultController : ControllerBase
{
private readonly List<Author> authors = new List<Author>();
public DefaultController()
{
authors.Add(new Author()
{
Id = 1,
FirstName = “Joydip”,
LastName = “Kanjilal”
});
authors.Add(new Author()
{
Id = 2,
FirstName = “Steve”,
LastName = “Smith”
});
}
[HttpGet]
public IEnumerable<Author> Get()
{
return authors;
}
[HttpGet(“{id}”, Name = “Get”)]
public Author Get(int id)
{
return authors.Find(x => x.Id == id);
}
}
}
在 Action 中返回 指定类型
最简单的方式就是在 Action 中直接返回一个 简单类型 或者 复杂类型,其实在上面的代码清单中,可以看到 Get 方法返回了一个 authors 集合,看清楚了,这个方法定义的是 IEnumerable<Author>。
[HttpGet]
public IEnumerable<Author> Get()
{
return authors;
}
在 ASP.NET Core 3.0 开始,你不仅可以定义同步形式的 IEnumerable<Author>方法,也可以定义异步形式的 IAsyncEnumerable<T>方法,后者的不同点在于它是一个异步模式的集合,好处就是 不阻塞 当前的调用线程,关于 IAsyncEnumerable<T> 更多的知识,我会在后面的文章中和大家分享。
下面的代码展示了如何用 异步集合 来改造 Get 方法。
[HttpGet]
public async IAsyncEnumerable<Author> Get()
{
var authors = await GetAuthors();
await foreach (var author in authors)
{
yield return author;
}
}
在 Action 中返回 IActionResult 实例
如果你要返回 data + httpcode 的双重需求,那么 IActionResult 就是你要找的东西,下面的代码片段展示了如何去实现。
[HttpGet]
public IActionResult Get()
{
if (authors == null)
return NotFound(“No records”);
return Ok(authors);
}
上面的代码有 Ok,NotFound 两个方法,对应着 OKResult,NotFoundResult, Http Code 对应着 200,404。当然还有其他的如:CreatedResult, NoContentResult, BadRequestResult, UnauthorizedResult, 和 UnsupportedMediaTypeResult,都是 IActionResult 的子类。
在 Action 中返回 ActionResult<T> 实例
ActionResult<T> 是在 ASP.NET Core 2.1 中被引入的,它的作用就是包装了前面这种模式,怎么理解呢? 就是即可以返回 IActionResult ,也可以返回指定类型,从 ActionResult<TValue> 类下的两个构造函数中就可以看的出来。
public sealed class ActionResult<TValue> : IConvertToActionResult
{
public ActionResult Result {get;}
public TValue Value {get;}
public ActionResult(TValue value)
{
if (typeof(IActionResult).IsAssignableFrom(typeof(TValue)))
{
throw new ArgumentException(Resources.FormatInvalidTypeTForActionResultOfT(typeof(TValue), “ActionResult<T>”));
}
Value = value;
}
public ActionResult(ActionResult result)
{
if (typeof(IActionResult).IsAssignableFrom(typeof(TValue)))
{
throw new ArgumentException(Resources.FormatInvalidTypeTForActionResultOfT(typeof(TValue), “ActionResult<T>”));
}
Result = (result ?? throw new ArgumentNullException(“result”));
}
}
有了这个基础,接下来看看如何在 Action 方法中去接这两种类型。
[HttpGet]
public ActionResult<IEnumerable<Author>> Get()
{
if (authors == null)
return NotFound(“No records”);
return authors;
}
和文章之前的 Get 方法相比,这里直接返回 authors 而不需要再用 OK(authors) 包装,是不是一个非常好的简化呢? 接下来再把 Get 方法异步化,首先考虑下面返回 authors 集合的异步方法。
private async Task<List<Author>> GetAuthors()
{
await Task.Delay(100).ConfigureAwait(false);
return authors;
}
值得注意的是,异步方法必须要有至少一个 await 语句,如果不这样做的话,编译器会提示一个警告错误,告知你这个方法将会被 同步执行,为了避免出现这种尴尬,我在 Task.Delay 上做了一个 await。
下面就是更新后的 Get 方法,注意一下这里我用了 await 去调用刚才创建的异步方法,代码参考如下。
[HttpGet]
public async Task<ActionResult<IEnumerable<Author>>> Get()
{
var data = await GetAuthors();
if (data == null)
return NotFound(“No record”);
return data;
}
如果你有一些定制化需求,可以实现一个自定义的 ActionResult 类,做法就是实现 IActionResult 中的 ExecuteResultAsync 方法即可。
译文链接:www.infoworld.com/article/3520770/how-to-return-data-from-aspnet-core-web-api.html
到此这篇关于详解如何在ASP.NET Core Web API中以三种方式返回数据的文章就介绍到这了,更多相关ASP.NET Core Web API返回数据内容请搜索华域联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持华域联盟!
您可能感兴趣的文章:ASP.NET Core3.1 Ocelot负载均衡的实现ASP.NET Core3.1 Ocelot认证的实现ASP.NET Core3.1 Ocelot路由的实现Asp.Net Core 调用第三方Open API查询物流数据的示例ASP.NET Core WebApi版本控制的实现asp.net core webapi文件上传功能的实现详解ASP.NET Core Web Api之JWT刷新Token在IIS上部署ASP.NET Core Web API的方法步骤ASP.NET Core WebAPI实现本地化(单资源文件)ASP.NET Core3.x API版本控制的实现Asp.Net Core使用swagger生成api文档的完整步骤ASP.NET Core Api网关Ocelot的使用初探
ASP.NET
Core
Web
API
返回数据
相关文章
asp.net下Request.QueryString取不到值的解决方法 2008-01-01
ASP.NET对IIS中的虚拟目录进行操作的代码在做系统开发的过程中,我们经常会遇到用asp.net来操作IIS,如新建虚拟目录、更改虚拟目录的属性、删除虚拟目录等操作,现在分析如下 2012-10-10
.net中下载文件的实例代码.net中下载文件的实例代码,需要的朋友可以参考一下 2013-03-03
asp.net 退出登陆(解决退出后点击浏览器后退问题仍然可回到页面问退出登陆是再常见不过的了,先清除Session,再转到登陆页面 2009-04-04
微信公众平台开发教程(二) 基本原理及消息接口总结本篇文章主要介绍了微信公众平台开发教程(二) 基本原理及消息接口,具有一定的参考价值,有兴趣的朋友可以了解一下。
2016-12-12
Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现这篇文章主要介绍了Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 2021-03-03
调试ASP.NET应用程序的方法和技巧调试ASP.NET应用程序的方法和技巧… 2006-09-09
asp.net实现的群发邮件功能详解这篇文章主要介绍了asp.net实现的群发邮件功能,结合具体实例形式分析了asp.net基于SMTP服务群发QQ邮件的相关操作技巧与注意事项,需要的朋友可以参考下 2017-05-05
保护.net中的dll文件方法(防止破解、反编译dll).net是一种建立在虚拟机上执行的语言,它直接生成 MSIL 的中间语言,再由.net编译器 JIT 解释映象为本机代码并交付CPU执行。中间语言很容易被反编译,所以研究下如何有效的保护dll文件 2013-02-02
MVC4制作网站教程第四章 前台栏目浏览4.5这篇文章主要为大家详细介绍了MVC4制作网站教程,前台栏目浏览功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 2016-08-08
最新评论

评论(0)