從零開始搭建前后端分離的NetCore2.2(EF Core CodeFirst+Autofac)+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}

  

  在下一篇中將介紹如何使用Nlog來記錄日志,並存至sqlserver數據庫。

 

  有需要源碼的可通過此 GitHub 鏈接拉取 覺得還可以的給個 start 哦,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM