从零开始搭建前后端分离的NetCore(EF Core CodeFirst+Au)+Vue的项目框架之三统一返回数据

Posted levywang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始搭建前后端分离的NetCore(EF Core CodeFirst+Au)+Vue的项目框架之三统一返回数据相关的知识,希望对你有一定的参考价值。

在 上一篇 中讲到如何通过autofac将DbContext和model进行解耦,只用添加model,而不用在DbContext中添加DbSet。这一篇将讲到如何统一后端返回数据模型。

首先我们得明白一般后端应该返回给前端一些什么数据。根据我所接触到的开放平台接口以及自己平常所涉及到的知识。

大概总结了一下几个点,一得有返回的状态码,二得有返回的状态信息,三得有返回的数据值。

如果说是有错误的情况下,应当返回错误模型,错误模型包括错误编码及错误简介。错误编码是为了提供给使用接口的人查找该错误编码的解决方式,错误简介则是告知这大概是什么样的错误。

该节中需要使用到前面已经封装好的静态扩展方法,传送门  请自行选择添加!!

  1. 在CoreMvc项目下新建返回模型类 ResponseResult 内容如下:
    技术图片
    /// <inheritdoc />
        /// <summary>
        /// 响应返回体
        /// </summary>
        public class ResponseResult : ResponseResult<object>
        
        
        /// <summary>
        /// 响应返回体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class ResponseResult<T> : BaseResponseResult
        
            public T Data  get; set; 
    
            public ResponseResult<T> Fail(int code, string msg, T data)
            
                Code = code;
                Message = msg;
                Data = data;
                return this;
            
    
            public ResponseResult<T> Succeed(T data, int code = 200, string msg = "successful")
            
                Code = code;
                Message = msg;
                Data = data;
                return this;
            
        
        public class BaseResponseResult
        
            public int Code  get; set; 
    
            public string Message  get; set; 
    
            public bool Success => Code == 200;//自定义成功状态码为200
        
    View Code
  2. 新建自定义返回给前端的Json结果数据类 CustomJsonResult ,需继承 ActionResult 内容如下:
    技术图片
    /// <summary>
        /// 自定义返回Json数据
        /// </summary>
        public class CustomJsonResult : ActionResult
        
            public object Data  get; set; 
    
            public string DateTimeFormat  get; set;  = "yyyy-MM-dd HH:mm:ss";
    
    
            public override void ExecuteResult(ActionContext context)
            
                if (context == null)
                    throw new ArgumentNullException(nameof(context));
                var response = context.HttpContext.Response;
                response.ContentType = "application/json";
                if (Data == null) return;
                if (string.IsNullOrEmpty(DateTimeFormat))
                
                    DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
                
                string json;
    #if DEBUG
                json = Data.ToJson(true, true, true, DateTimeFormat);//方便调式
    #else
                json = Data.ToJson(true, false, true, DateTimeFormat);
    #endif
                var data = Encoding.UTF8.GetBytes(json);
                response.Body.Write(data, 0, data.Length);
            
        
    View Code
  3. 新建自定义返回给前端的Json结果数据类(包含HTTP状态码) CustomHttpStatusCodeResult ,需继承 ActionResult 内容如下:
    技术图片
    /// <summary>
        /// 返回带有HTTP状态码的json结果
        /// </summary>
        public class CustomHttpStatusCodeResult : ActionResult
        
    
            public int StatusCode  get; 
    
            public string Data  get; 
    
            public CustomHttpStatusCodeResult(int httpStatusCode, int msgCode, string content = "", object data = null)
            
                StatusCode = httpStatusCode;
                Data = new ResponseResult().Fail(msgCode, content ?? "", data ?? "").ToJson(true, isLowCase: true);
            
    
            public override void ExecuteResult(ActionContext context)
            
                if (context == null)
                    throw new ArgumentNullException(nameof(context));
                context.HttpContext.Response.StatusCode = StatusCode;
                if (string.IsNullOrEmpty(Data))
                    return;
                context.HttpContext.Response.ContentType = "application/json";
                var bytes = Encoding.UTF8.GetBytes(Data);
    
                context.HttpContext.Response.Body.Write(bytes, 0, bytes.Length);
            
        
    View Code
  4. 新建 BaseController 用来封装返回数据以及获取参数等方法,需继承 Controller 内容如下:
    技术图片
    public abstract class BaseController : Controller
        
            /// <summary>
            /// 从 Request.Body 中获取数据并JSON序列化成对象
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <returns></returns>
            protected T GetJsonParams<T>()
            
                if (Request.ContentLength != null)
                
                    var bytes = new byte[(int)Request.ContentLength];
                    Request.Body.Read(bytes, 0, bytes.Length);
                    var json = Encoding.UTF8.GetString(bytes);
                    return json.ToNetType<T>();
                
    
                return default(T);
            
    
            /// <summary>
            /// 返回Json数据
            /// </summary>
            /// <param name="data"></param>
            /// <returns></returns>
            protected ActionResult MyJson(BaseResponseResult data)
            
                return new CustomJsonResult
                
                    Data = data,
                    DateTimeFormat = "yyyy-MM-dd HH:mm:ss"
                ;
            
    
            /// <summary>
            /// 返回成功
            /// Json格式
            /// </summary>
            /// <returns></returns>
            protected ActionResult Succeed()
            
                return Succeed(true);
            
    
            /// <summary>
            /// 返回成功
            /// Json格式
            /// </summary>
            /// <param name="data"></param>
            /// <returns></returns>
            protected ActionResult Succeed(object data)
            
                return MyJson(new ResponseResult().Succeed(data));
            
    
            [ApiExplorerSettings(IgnoreApi = true)]
            public ActionResult Fail(int code, string content = "", string desc = null)
            
                return MyJson(new ResponseResult().Fail(code, content + " " + desc, "")
               );
            
    
            [ApiExplorerSettings(IgnoreApi = true)]
            public override void OnActionExecuting(ActionExecutingContext context)
            
                base.OnActionExecuting(context);
            
    
            [ApiExplorerSettings(IgnoreApi = true)]
            public override void OnActionExecuted(ActionExecutedContext context)
            
    
            
        
    View Code

     

在这里就基本已经完成了返回数据的统一了,在每个控制器上都继承 BaseController 类,然后再返回数据的时候直接使用。

  1. return Succeed(new string[] "value1"); 返回成功消息。
  2. return Fail(1001,"错误返回示例");//1001为自己自定义错误码 返回错误消息
  3. var response = new ResponseResult(); response.Succeed("成功消息"); return MyJson(response);  自定义需要返回结果
  4. var requestStr = GetJsonParams<string>(); 可使用此语句从请求Body中取出数据,方便使用。
    也可定义相对应模型使用 [FromBody] 从请求Body中获取:如 [FromBody]DemoModel demo ,前端传的数据:Id:1, CustomerName:"levy",IdentityCardType: 1

  

  在下一篇中将介绍如何使用过滤器来进行全局异常处理,处理那些未处理的异常或自定义抛出的异常。

 

  有需要源码的在下方评论或私信~给我的SVN访客账户密码下载,代码未放在GitHub上。

以上是关于从零开始搭建前后端分离的NetCore(EF Core CodeFirst+Au)+Vue的项目框架之三统一返回数据的主要内容,如果未能解决你的问题,请参考以下文章

从零开始搭建前后端分离的NetCore2.2(EF Core CodeFirst+Autofac)+Vue的项目框架之七使用JWT生成Token(个人见解)

从零开始搭建django前后端分离项目 系列一(技术选型)

还在从零开始搭建项目?推荐一款高颜值的前后端分离脚手架!

从零开始搭建django前后端分离项目 系列五(实战之excel流式导出)

前后端分离项目从零开始

从零开始,搭建博客系统MVC5+EF6搭建框架上,前后台页面布局页面实现,介绍使用的UI框架以及JS组件