zoukankan      html  css  js  c++  java
  • 从零开始搭建前后端分离的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 哦,谢谢!

  • 相关阅读:
    Pycharm中的加载多个项目
    Python中的条件选择和循环语句
    Python中的模块
    python在不同层级目录import模块的方法
    数据结构与算法分析:C语言描述(原书第2版 简体中文版!!!) PDF+源代码+习题答案
    数据结构和算法关系
    二叉树及二叉树的遍历
    栈及其应用
    基础知识- 算法复杂度
    Java 特定规则排序-LeetCode 179 Largest Number
  • 原文地址:https://www.cnblogs.com/levywang/p/coreframe_3.html
Copyright © 2011-2022 走看看