您好,登錄后才能下訂單哦!
AspNetCore WebApi如何實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wè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); }
小明寫(xiě)著寫(xiě)著發(fā)現(xiàn)這樣寫(xiě),很多接口相同得地方都要寫(xiě),使得代碼比較臃腫。
使用模型驗(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)置特性
Error messages
通過(guò)驗(yàn)證特性可以指定要為無(wú)效輸入顯示的錯(cuò)誤消息。 例如:
[Required(ErrorMessage = "名稱不能為空")]
使用自定義返回消息格式
有兩種方式:
使用自定義過(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字符串大小寫(xiě)原樣輸出 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); }; });
看完上述內(nèi)容,你們掌握AspNetCore WebApi如何實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。