平台网站建设协议书,东莞销售网站设计,上海平面网站,网站建设公司宣传标语我们开发接口时#xff0c;一般都会涉及到参数校验、异常处理、封装结果返回等处理。如果每个后端开发在参数校验、异常处理等都是各写各的#xff0c;没有统一处理的话#xff0c;代码就不优雅#xff0c;也不容易维护。所以#xff0c;我们需要统一校验参数#xff0c;…我们开发接口时一般都会涉及到参数校验、异常处理、封装结果返回等处理。如果每个后端开发在参数校验、异常处理等都是各写各的没有统一处理的话代码就不优雅也不容易维护。所以我们需要统一校验参数统一异常处理、统一结果返回让代码更加规范、可读性更强、更容易维护。统一参数校验比如我们需要入参为必填只需要在实体类字段添加 [Required]/// summary////// /summarypublic class AdminInputDto{/// summary/// 账号/// /summary[Required]public string UserName { get; set; }/// summary/// 密码/// /summary[Required]public string Password { get; set; }}然后再OnActionExecuting 进行验证public override void OnActionExecuting(ActionExecutingContext context){//模型验证if (!context.ModelState.IsValid){throw new CustomException(context.ModelState.Values.First(p p.Errors.Count 0).Errors[0].ErrorMessage, ReturnCode.E1000002);}base.OnActionExecuting(context);}统一结果返回统一标准的返回格式。一般一个标准的响应报文对象code 响应状态码message 响应结果描述data返回的数据定义一个统一的返回对象模板/// summary/// Service的返回数据/// /summarypublic class ReturnData : ReturnDataobject{}/// summary/// Service的返回数据/// /summarypublic class ReturnDataT{/// summary/// 返回码/// /summarypublic ReturnCode Code { get; set; }/// summary/// 消息/// /summarypublic string Message { get; set; }/// summary/// 结果数据/// /summarypublic T Data { get; set; }/// summary/// 判断处理是否成功/// /summarypublic bool Success{get { return ReturnCode.E10000 Code; }}}在控制器返回的时候进行返回包装/// summary/// 处理正常返回的结果对象/// /summary/// param namecontext/parampublic override void OnActionExecuted(ActionExecutedContext context){if (context.Result ! null){var serializerSettings new JsonSerializerSettings{DateTimeZoneHandling DateTimeZoneHandling.Local,DateFormatString yyyy-MM-ddTHH:mm:ss.fffzz:00,//设置缩进Formatting Formatting.Indented,//设置json格式为驼峰式ContractResolver new CamelCasePropertyNamesContractResolver()};var result context.Result as ObjectResult;JsonResult newresult;if (context.Result is ObjectResult){newresult new JsonResult(new ReturnData { Message 操作成功, Code ReturnCode.E10000, Data result.Value }, serializerSettings);}else if (context.Result is EmptyResult){newresult new JsonResult(new ReturnData { Message 操作成功, Code ReturnCode.E10000 }, serializerSettings);}else{throw new Exception($未经处理的Result类型{ context.Result.GetType().Name});}context.Result newresult;}base.OnActionExecuted(context);}统一异常处理遇到未处理的异常进行统一的封装/// summary/// api异常统一处理过滤器/// /summarypublic class ApiExceptionFilterAttribute : ExceptionFilterAttribute{public override void OnException(ExceptionContext context){context.Result BuildExceptionResult(context.Exception);base.OnException(context);}/// summary/// 包装处理异常格式/// /summary/// param nameex/param/// returns/returnsprivate JsonResult BuildExceptionResult(Exception ex){var returnData new ReturnData();var exresult ex as CustomException;var WriteLog true;if (exresult ! null){//异常为自定义的异常returnData.Code exresult.ErrorCode;returnData.Message exresult.Message;WriteLog exresult.WriteLog;}else{//异常为未知异常returnData.Code ReturnCode.E1000001;returnData.Message ex.Message;}//TODO 日志var serializerSettings new JsonSerializerSettings{DateTimeZoneHandling DateTimeZoneHandling.Local,DateFormatString yyyy-MM-ddTHH:mm:ss.fffzz:00,//设置缩进Formatting Formatting.Indented,//设置json格式为驼峰式ContractResolver new CamelCasePropertyNamesContractResolver()};return new JsonResult(returnData, serializerSettings);}}
}