经常遇到需要后端工程师提供API接口给微信端或者手机APP,这个时候返回统一的结果类型就显得很重要,我们先定义好返回的结果类:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using MyCode.Business.Enum; namespace MyCode.Business.Message { public class Result { public Object Data { get; set; } public ResultCode ResultCode { get; set; } public string ErrorMessage { get; set; } } }
如果接口需要返回数据,我们统一放在Data里面,不管返回的是List还是int,而如果出错,我们将出错信息放在ErrorMessage,ResultCode是个枚举类型,定义如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MyCode.Business.Enum { /// <summary> /// 返回结果的枚举 /// </summary> public enum ResultCode { /// <summary> /// 成功 /// </summary> Success = 1, /// <summary> /// 发生错误 /// </summary> Error = -1 } }
在站点中添加类:
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.Filters; using MyCode.Business.Message; using MyCode.Business.Enum; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Http; namespace MyCode.WebAdmin.Filter { public class ResultHandleAttribute : ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext actionExecutedContext) { base.OnActionExecuted(actionExecutedContext); if (actionExecutedContext.Result is ObjectResult || actionExecutedContext.Result is EmptyResult) { if (actionExecutedContext.Exception == null) { Result result = new Result(); result.ResultCode = ResultCode.Success; if (actionExecutedContext.Result is ObjectResult) { result.Data = (actionExecutedContext.Result as ObjectResult).Value; } Newtonsoft.Json.JsonSerializerSettings JsonSetting = new Newtonsoft.Json.JsonSerializerSettings(); JsonSetting.Formatting = Newtonsoft.Json.Formatting.None; actionExecutedContext.Result = new JsonResult(result, JsonSetting); } } } } }
然后再在Startup.cs中的ConfigureServices(IServiceCollection services)方法体内,增加:
services.AddMvc(options => { options.Filters.Add(new MyCode.WebAdmin.Filter.ResultHandleAttribute()); } );
而在control层,根据返回方法直接返回实际的类型就可以了,程序会统一再处理一遍,返回统一的Result类型。