手把手教你AspNetCore WebApi數(shù)據(jù)驗(yàn)證的實(shí)現(xiàn)
前言
小明最近又遇到麻煩了,小紅希望對(duì)接接口傳送的數(shù)據(jù)進(jìn)行驗(yàn)證,既然是小紅要求,那小明說(shuō)什么都得滿足呀,這還不簡(jiǎn)單嘛。
傳統(tǒng)驗(yàn)證
[HttpPost] public async Task<ActionResult<Todo>> PostTodo(Todo todo) { if (string.IsNullOrEmpty(todo.Name)) { return Ok("名稱不能為空"); } context.Todo.Add(todo); await context.SaveChangesAsync(); return CreatedAtAction("GetTodo", new { id = todo.Id }, todo); }
小明寫著寫著發(fā)現(xiàn)這樣寫,很多接口相同得地方都要寫,使得代碼比較臃腫。
使用模型驗(yàn)證
在參數(shù)模型上打上注解
namespace App001.Models { /// <summary> /// 待辦事項(xiàng) /// </summary> public class Todo { /// <summary> /// ID /// </summary> public Guid Id { get; set; } /// <summary> /// 名稱 /// </summary> [Required(ErrorMessage = "名稱不能為空")] public string Name { get; set; } } }
Postman測(cè)試Name傳值未空時(shí),則返回:
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "|df184e36-4e11844dfd38a626.", "errors": { "Name": [ "名稱不能為空" ] } }
注意Web API 控制器具有 [ApiController] 特性,則它們不必檢查ModelState.IsValid。在此情況下,如果模型狀態(tài)無(wú)效,將返回包含錯(cuò)誤詳細(xì)信息的自動(dòng) HTTP 400 響應(yīng)。
內(nèi)置特性
- [CreditCard]:驗(yàn)證屬性是否具有信用卡格式。
- [Compare]:驗(yàn)證模型中的兩個(gè)屬性是否匹配。
- [EmailAddress]:驗(yàn)證屬性是否具有電子郵件格式。
- [Phone]:驗(yàn)證屬性是否具有電話號(hào)碼格式。
- [Range]:驗(yàn)證屬性值是否在指定的范圍內(nèi)。
- [RegularExpression]:驗(yàn)證屬性值是否與指定的正則表達(dá)式匹配。
- [Required]:驗(yàn)證字段是否不為 null。
- [StringLength]:驗(yàn)證字符串屬性值是否不超過(guò)指定長(zhǎng)度限制。
- [Url]:驗(yàn)證屬性是否具有 URL 格式。
- [Remote]:通過(guò)在服務(wù)器上調(diào)用操作方法來(lái)驗(yàn)證客戶端上的輸入。
Error messages
通過(guò)驗(yàn)證特性可以指定要為無(wú)效輸入顯示的錯(cuò)誤消息。 例如:
[Required(ErrorMessage = "名稱不能為空")]
使用自定義返回消息格式
有兩種方式:
- 使用自定義過(guò)濾器
- 使用默認(rèn)模型驗(yàn)證,需要在控制器上面加上【ApiController】。
使用自定義過(guò)濾器
首先,創(chuàng)建ModelValidateActionFilterAttribute過(guò)濾器。
public class ModelValidateActionFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext context) { if (!context.ModelState.IsValid) { //獲取驗(yàn)證失敗的模型字段 var errors = context.ModelState .Where(e => e.Value.Errors.Count > 0) .Select(e => e.Value.Errors.First().ErrorMessage) .ToList(); var str = string.Join("|", errors); //設(shè)置返回內(nèi)容 var result = new { Code = 10000, Msg = "未通過(guò)數(shù)據(jù)驗(yàn)證。", FullMsg = str }; context.Result = new BadRequestObjectResult(result); } } }
然后,Startup.ConfigureServices將過(guò)濾器添加到控制器中并關(guān)閉默認(rèn)模型驗(yàn)證,另外我們還添加了AddNewtonsoftJson。
//關(guān)閉默認(rèn)模型驗(yàn)證 services.Configure<ApiBehaviorOptions>(opt => opt.SuppressModelStateInvalidFilter = true); services.AddControllers(opt => { //添加過(guò)濾器 opt.Filters.Add(typeof(ModelValidateActionFilterAttribute)); }).AddNewtonsoftJson(opt => { //json字符串大小寫原樣輸出 opt.SerializerSettings.ContractResolver = new DefaultContractResolver(); });
最后,我們看一下返回效果:
{ "Code": 10000, "Msg": "未通過(guò)數(shù)據(jù)驗(yàn)證。", "FullMsg": "名稱不能為空。" }
使用默認(rèn)模型驗(yàn)證
services.Configure<ApiBehaviorOptions>(opt => { opt.InvalidModelStateResponseFactory = actionContext => { //獲取驗(yàn)證失敗的模型字段 var errors = actionContext.ModelState .Where(e => e.Value.Errors.Count > 0) .Select(e => e.Value.Errors.First().ErrorMessage) .ToList(); var str = string.Join("|", errors); //設(shè)置返回內(nèi)容 var result = new { Code = 10000, Msg = "未通過(guò)數(shù)據(jù)驗(yàn)證。", FullMsg = str }; return new BadRequestObjectResult(result); }; });
小結(jié)
目前為止,小明把數(shù)據(jù)驗(yàn)證也搞定了,是不是so easy!
到此這篇關(guān)于手把手教你AspNetCore WebApi數(shù)據(jù)驗(yàn)證的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)AspNetCore WebApi數(shù)據(jù)驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Asp.Net 文件操作基類(讀取,刪除,批量拷貝,刪除,寫入,獲取文件夾大小,文件屬性,遍歷目錄)
Asp.Net 文件操作基類(讀取,刪除,批量拷貝,刪除,寫入,獲取文件夾大小,文件屬性,遍歷目錄),需要的朋友可以參考下2008-07-07淺談ASP.NET Core 中jwt授權(quán)認(rèn)證的流程原理
這篇文章主要介紹了淺談ASP.NET Core 中jwt授權(quán)認(rèn)證的流程原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03ASP.NET實(shí)現(xiàn)的簡(jiǎn)單易用文件上傳類
這篇文章主要介紹了ASP.NET實(shí)現(xiàn)的簡(jiǎn)單易用文件上傳類,本文給出實(shí)現(xiàn)代碼和使用方法示例,需要的朋友可以參考下2015-06-06Visual Studio 2017+OpenCV環(huán)境搭建教程
這篇文章主要為大家詳細(xì)介紹了Visual Studio 2017+OpenCV環(huán)境搭建教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03ASP.NET中RadioButtonList綁定后臺(tái)數(shù)據(jù)后觸發(fā)點(diǎn)擊事件
這篇文章主要介紹了ASP.NET中RadioButtonList綁定后臺(tái)數(shù)據(jù)后觸發(fā)點(diǎn)擊事件的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-05-05MVC+EasyUI+三層新聞網(wǎng)站建立 分頁(yè)查詢數(shù)據(jù)功能(七)
這篇文章主要為大家詳細(xì)介紹了MVC+EasyUI+三層新聞網(wǎng)站建立的第七篇,教大家如何分頁(yè)查詢出數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07ASP.NET The system cannot find the file specified解決辦法
這篇文章主要介紹了ASP.NET The system cannot find the file specified解決辦法的相關(guān)資料,需要的朋友可以參考下2016-11-11WPF實(shí)現(xiàn)左右移動(dòng)(晃動(dòng))動(dòng)畫效果
這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)左右移動(dòng)或晃動(dòng)動(dòng)畫效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12.Net Core WebApi的簡(jiǎn)單創(chuàng)建以及使用方法
這篇文章主要給大家介紹了關(guān)于.Net Core WebApi的簡(jiǎn)單創(chuàng)建以及使用方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用.Net Core WebApi具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09VS2022?.NET5一鍵發(fā)布到遠(yuǎn)程騰訊云IIS服務(wù)器的詳細(xì)步驟
這篇文章主要介紹了VS2022?.NET5一鍵發(fā)布到遠(yuǎn)程騰訊云IIS服務(wù)器,首先需要添加服務(wù)器相關(guān)功能,文中通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04