一般狀況下,對於那些常常爲別人提供數據接口的開發人員來講,對於調用方傳遞過來的參數都會有驗證處理。例如:java
if (string.IsNullOrEmpty(entity.Name)) { //當姓名爲空時,......... } if (entity.Age<0 || entity.Age>100) { //當年齡小於0或大於100時,有的人可能超過一百歲,我但願個人有生之年Age>100,emm,......... } if (string.IsNullOrEmpty(entity.PhoneNum)) { //當電話號碼爲空時,......... } if (!string.IsNullOrEmpty(entity.PhoneNum)) { Regex regex = new Regex("^1[34578]\\d{9}$"); var result=regex.IsMatch(entity.PhoneNum); if (!result) { //當電話號碼格式不合法時,......... } } //如下還有50個字段須要驗證,是否是有種絕望的感受,有木有?有木有?有人可能會跟調用者說,某個字段必須怎麼怎麼樣,有些人就喜歡故意傳錯,故意刁鑽,到頭來,最苦逼的仍是寫接口的人。
有時候一個系統有十幾二個接口,光驗證的代碼就一大堆,真的有時候不想寫,都說程序猿是最聰明的一批人,天然有好的解決方法。web
C# webapi 有一種叫模型驗證的東西,在java裏面,應該有一種註解的東西能夠處理。編程
在ASP.NET Web API中,你可使用System.ComponentModel.DataAnnotations命名空間的註解屬性來設置模型屬性的驗證規則。考慮如下模型:api
public class Personnel { [Required(ErrorMessage = "Name參數不能爲空")]//Required 驗證這個參數不能爲空 ErrorMessage:爲空時自定義錯誤信息 public string Name { get; set; } [Range(1,100, ErrorMessage="Age參數只能是大於1,小於100")]//Range 驗證值只能在某些範圍內,只適用於Int類型的字段 public int Age { get; set; } [Required(ErrorMessage = "電話號不能爲空")] [RegularExpression("^[1]+[3,4,5,7,8]+\\d{9}", ErrorMessage = "PhoneNum不合法的電話號碼格式")]//RegularExpression 用正則驗證字段的合法性,多用於身份證、電話號碼、郵箱、等等... public string PhoneNum { get; set; } }
這樣的話就能夠節省大量冗餘代碼,那麼,接下來如何去處理呢?ide
在接口請求以前,咱們能夠對客戶端傳過來的數據進行模型驗證處理,對於webapi比較熟悉的人應該知道過濾器,不知道的能夠看我前面的文章,如何使用webapi三大過濾器,過濾器是基於AOP,面向切面的編程思想。工具
在這裏咱們用的ActionFilterAttribute過濾器,只要繼承這個接口而且實現其中的OnActionExecuting方法就行。具體實現以下:post
using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http.Controllers; using System.Web.Http.Filters; using System.Web.Http.ModelBinding; namespace Huajie.Application.Web.Controllers.Apis { public class ModeActionFilter: ActionFilterAttribute { /// <summary> /// 接口請求前驗證數據 /// </summary> /// <param name="actionContext">上下文</param> public override void OnActionExecuting(HttpActionContext actionContext) { if (actionContext.ModelState.IsValid == false) { // Return the validation errors in the response body. // 在響應體中返回驗證錯誤信息 var errors = new Dictionary<string, IEnumerable<string>>(); foreach (KeyValuePair<string, ModelState> keyValue in actionContext.ModelState) { errors[keyValue.Key] = keyValue.Value.Errors.Select(e => e.ErrorMessage); } actionContext.Response =actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, new { code= HttpStatusCode.BadRequest,//返回客戶端的狀態碼 success = false, error = errors//顯示驗證錯誤的信息 }); } } } }
在WebApiConfig.cs裏面註冊一下這個過濾器測試
config.Filters.Add(new ModeActionFilter());
請求方法示例:ui
[Route("test")] [HttpPost] public string Test([FromBody] Personnel entity ) { return "成功!"; }
接下來咱們就是要postman接口測試工具就來看一下效果spa
提示的信息是否是很熟悉,對的,就是咱們自定義的錯誤信息
給你們展現參數傳遞正確的效果
看到這裏,是否是感受又掌握了一點東西。
只要你肯去鑽研,去折騰,你總會收穫點什麼!