ASP.NET Core WebAPI控制器返回类型的最佳选项
前言
从.NET Core 2.1版开始,到目前为止,控制器操作可以返回三种类型的WebApi响应。这三种类型都有自己的优点和缺点,但都缺乏满足REST和高可测性的选项。
ASP.NET Core中可用的响应类型包括最近发布的2.2版本
- 具体类型的结果
- IActionResult
- 的ActionResult <T>
最后一个reult选项 ActionResult <T>是在.NET Core 2.1中引入的。我将使用一个简单的例子来比较使用这三个控制器动作响应类型选项的优缺点。
文章内容
返回HTTP状态
这是您在WebAPI应用程序开发过程中必须要具备的。虽然可以遵循REST,但是任何程序功能都是由业务需求驱动的。如果由于控制器操作而返回特定类型,您可能偶尔发现的一件事肯定会返回自定义HTTP状态代码。
让我们看看具有特定类型返回的简单操作,并让它们注意比较。
具体类型
[HttpGet("{id}")]public IEnumerable<string> GetById(int id){if (id>0){return new List<string>(){"Value1","Value2","Value3"};}return null;}
我们有了上面的简单单吗,如果ID参数大于0,并返回字符串列表,反则返回null。转换成HTTP,对于任何返回的数据,我们将有 200 OK 状态吗响应,以下是我使用PostMan的测试结果图,请参考。
如果没有数据,我们将会有一个204 No Content 响应。 对于大多数客户来说,这是非常满意的,但是假设我们需要返回另一个状态代码,例如,小于0的任何值,我们直接希望告诉客户发送的数据无效,理想情况下,我们将会返回404 BadRequest状态代码。
现在这是特定类型选项问题,由于我们的方法,我们不能立即返回400 BadRequest状态代码,如果我们决定抛出一个异常会导致500 ServerError的响应,这是错误的,因为无效数据基本上是客户端错误并且属于4xx响应代码列表。
执行此操作的方法是显示设定响应状态码并返回空值,这样就可以保留未同步的两个操作间隙,因为你必须要处理状态并返回数据。
[HttpGet("{id}")]public IEnumerable<string> GetById(int id){if (id > 0){return new List<string>(){"Value1","Value2","Value3"};}else if (id < 0)Response.StatusCode = 400;return null;}
处理HTTP POST和HTTP PATCH / PUT请求时遇到的问题更多,而不是200 OK,除了之前的400 BadRequest之外,您可能还必须使用201 Created of 202 Accepted HTTP状态代码进行响应,这将是模型验证的情况。使用不同的状态代码并不是那么直接,并且您有多条线负责正确的响应,这与其他两种返回类型不同。
IActionResult
让我们看看我们如何通过使用IActionResult作为控制器动作的返回类型来解决这个问题
[HttpGet("{id}")]public IActionResult GetById(int id){if (id > 0){return Ok(new List<String>(){"Value1","Value2","Value3",});}else if (id < 0){return BadRequest();}return NoContent();}
现在我们可以自由使用我们认为适合的状态代码,以告知客户我们或我们没有任何限制地处理他的请求。使用IAction结果显然比返回特定类型实例更先进,让.NET决定什么是状态代码。
ActionResult<T>
关于状态代码,IActionResult和ActionResult <T>返回类型同样适用在从方法返回结果时直接设置状态代码方面会产生很大差异
但是,还有其他方面,ActionResult <T>比IActionResult更高级,更适合从控制器操作方法返回响应。
[HttpGet("{id}")]public ActionResult<IEnumerable<string>> GetById(int id){if (id > 0){return Ok(new List<String>(){"Value1","Value2","Value3",});}else if (id < 0){return BadRequest();}return NoContent();}
您已经了解了ASP.NET MVC Core WebAPI项目中控制器操作的不同响应类型的一些优缺点。很明显IActionResult和ActionResult <T>是比返回特定类型更好的选择,虽然您可能会发现在控制器操作中返回特定类型更为舒适,但您可能会使单元测试无法正确覆盖您的代码,因此将来可能会打开潜在的危险。
总结
具体类型
如果在执行动作期间没有已知的防范条件,则返回特定类型就足够了。上述操作不接受任何参数,因此不需要参数约束验证。
IActionResult类型
当一个动作中有多个ActionResult返回类型时,IActionResult返回类型是合适的。这些类型代表各种HTTP状态代码。属于此类别的一些常见返回类型是BadRequestResult(400),NotFoundResult(404)和OkObjectResult(200)。
ActionResult <T>类型
大多数操作都有特定的返回类型。在操作执行期间可能发生意外情况,在这种情况下不返回特定类型。例如,操作的输入参数可能无法通过模型验证。在这种情况下,通常返回适当的
ActionResult
类型而不是特定类型。
转载于:https://www.cnblogs.com/lonelyxmas/p/10154007.html
ASP.NET Core WebAPI控制器返回类型的最佳选项相关推荐
- ASP.NET Core WebAPI JWT Bearer 认证失败返回自定义数据 Json
开发环境:ASP.NET Core Web API 目标框架:.NET Core 2.2 权限认证:JWT Bearer 提供者:成长的小猪 Jason Song 应用场景:当前我们给微信小程 ...
- ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...
- asp.net core WebAPI实现CRUD
本节用于构建一个简单的WebAPI来管理to-do列表.不会创建用户界面. API Description Request body Response body GET /api/todo Get a ...
- 【转】ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
原文链接:https://www.cnblogs.com/yilezhu/p/9241261.html 引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必 ...
- ASP.Net Core WebApi几种版本控制对比
ASP.Net Core WebApi几种版本控制对比 原文:ASP.Net Core WebApi几种版本控制对比 一.版本控制的好处: (1)有助于及时推出功能, 而不会破坏现有系统. (2)它还 ...
- ASP.NET CORE WEBAPI文件下载
最近要使用ASP.NET CORE WEBAPI用来下载文件,使用的.NET CORE 3.1.考虑如下场景: 文件是程序生成的. 文件应该能兼容各种格式. 浏览器可以感知进行下载. 准备 经过简单的 ...
- asp.net core webApi 参数保护
Intro asp.net core data protection 扩展,基于 IDataProtector 扩展的数据保护组件,自动化的实现某些参数的保护 ParamsProtection Par ...
- 第十三节:Asp.Net Core WebApi基础总结和请求方式-第十八节
一. 基础总结 1.Restful服务改造 Core下的WebApi默认也是Restful格式服务,即通过请求方式(Get,post,put,delete)来区分请求哪个方法,请求的URL中不需要写方 ...
- Vue + Element+ ASP.NET Core WebAPI 文件上传下载
以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备asp.net后端文件上传的API Uplo ...
最新文章
- 用Piranha来实现WEB的负载均衡
- 百度地图API二次开发小经验分享
- option等为空的选择
- Web APi之控制器选择Action方法过程(九)
- 通过Matlab发送邮件要注意的问题
- python文本关键词匹配_NLP利剑篇之模式匹配
- Buildroot 龙芯1C支持指南
- Hystrix面试 - 深入 Hystrix 断路器执行原理
- selenium自定义find_element
- MQTT工作笔记0002---阿里云物联网简介_以及物联网平台下的一些名词
- 分布式之API接口返回格式如何优雅设计?,苦熬一个月
- LeetCode90. 子集 II(回溯)
- python的类和对象_Python面向对象之类和对象实例详解
- 一些碰到的陌生的技术名词搜集(持续更新……)
- 数据分析:销售数据怎么分析?简单概述
- lte tm模式_TD―LTE TM8传输模式分析
- 3D建模和处理软件以及相关的库(来自中科大老师)
- 斯伦贝谢好进吗_拼集市 环球购30%智商税你还交吗
- win7系统安装卡在启动服务器,安装win7卡在启动界面不动进不了BIOS的解决方法 - 系统家园...
- e路航LH900N导航仪凯立德最新版本地图更新方法