.net core api 全局統一數據返回格式


簡單實現接口返回統一格式:添加api接口執行時長


 

 

 

1.使用方式

// This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            //注冊MemoryCache緩存中間件
            services.AddMemoryCache();

            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            //注冊Mvc
            services.AddControllers(options =>
            {
                //注冊全局過濾器服務
                options.Filters.Add(typeof(AppExceptionFilter));
                //options.Filters.Add(typeof(AuthorizeFilter));
                options.Filters.Add(typeof(AppResultFilter));
                options.RespectBrowserAcceptHeader = true;
            }).AddControllersAsServices()
            //使用NewtonsoftJson序列化數據
            .AddNewtonsoftJson(options =>
            {
                //取消駱駝命名法
                //options.SerializerSettings.ContractResolver = new DefaultContractResolver();
                //設置返回datetime時間格式
                options.SerializerSettings.DateFormatString = "yyyy'-'MM'-'dd' 'HH':'mm':'ss";
            }
            );
}

    [HttpGet] [ProducesResponseType(
typeof(ApiResult<List<WeatherForecast>>), 200)] public IEnumerable<WeatherForecast> Get() { var a = dishesCategoryRepository.CountAll(); var rng = new Random(); return Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateTime.Now.AddDays(index), TemperatureC = rng.Next(-20, 55), Summary = Summaries[rng.Next(Summaries.Length)] }) .ToArray(); }
    
       /// 返回數據格式   
    {
      "httpStatus" :200,      

      "data" :{},

      "message" :"執行成功",
      "timeOut":2021
    }

 

2.具體實現

/// <summary>
    /// 返回結果過濾器,統一返回數據格式
    /// </summary>
    public class AppResultFilter : Attribute, IActionFilter
    {
        /// <summary>
        /// 請求時長計時開始
        /// </summary>
        private readonly Stopwatch watch = new Stopwatch();


        /// <summary>
        /// 返回結果執行之前
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuting(ActionExecutingContext context)
        {
            watch.Start();//開始  
        }

        /// <summary>
        /// 返回結果執行之后
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuted(ActionExecutedContext context)
        {

            watch.Stop();
            //根據實際需求進行具體實現
            if (context.Result is ObjectResult)
            {
                var objectResult = context.Result as ObjectResult;
                if (objectResult.Value == null)
                {
                    context.Result = new ObjectResult(new ApiResult { HttpStatus = HttpStatusCode.NotFound, Message = "未找到資源", TimeOut = watch.ElapsedMilliseconds });
                }
                else
                {
                    if (objectResult.Value is ApiResult)
                    {
                        var result = (ApiResult)objectResult.Value;
                        result.TimeOut = watch.ElapsedMilliseconds;
                        context.Result = new ObjectResult(result);
                        return;
                    }
                    context.Result = new ObjectResult(new ApiResult { HttpStatus = HttpStatusCode.OK, Message = "請求成功", Data = objectResult.Value, TimeOut = watch.ElapsedMilliseconds });
                    //判讀是否返回的是元組
                    //返回數據並且返回總行數 public async Task<(List<object>,int)> Paging(PagingBaseRequest parameter) { retuen ( new List<object>{ },1000) }
                    if (objectResult.DeclaredType != null && objectResult.DeclaredType.Name == "ValueTuple`2")
                    {
                        dynamic value = objectResult.Value;
                        if (value.Item1 != null)
                        {
                            if (value.Item1 is int)
                            {
                                //返回元組格式(int,List<object>)
                                context.Result = new ObjectResult(new ApiResult { HttpStatus = HttpStatusCode.OK, Message = "請求成功", TimeOut = watch.ElapsedMilliseconds, Data = new { Count = value.Item1, Data = value.Item2 } });
                            }
                            else
                                //返回元組格式(List<object>,int)
                                context.Result = new ObjectResult(new ApiResult { HttpStatus = HttpStatusCode.OK, Message = "請求成功", TimeOut = watch.ElapsedMilliseconds, Data = new { Count = value.Item2, Data = value.Item1 } }); } }

                }
            }
            else if (context.Result is EmptyResult)
            {
                context.Result = new ObjectResult(new ApiResult { HttpStatus = HttpStatusCode.OK, Message = "請求成功" });
            }
            else if (context.Result is ContentResult)
            {
                context.Result = new ObjectResult(new ApiResult { HttpStatus = HttpStatusCode.OK, Message = "", TimeOut = watch.ElapsedMilliseconds, Data = (context.Result as ContentResult).Content });
            }
            else if (context.Result is StatusCodeResult)
            {
                context.Result = new ObjectResult(new { HttpStatus = (context.Result as StatusCodeResult).StatusCode, TimeOut = watch.ElapsedMilliseconds, Message = "" });
            }
            else if (context.Result is Exception)
            {
                var result = context.Result as Exception;
                context.Result = new ObjectResult(new { HttpStatus = HttpStatusCode.BadRequest, TimeOut = watch.ElapsedMilliseconds, Message = result.Message });
            }
        }

    }
   /// <summary>
    /// 數據返回模型基類
    /// </summary>
    public class ApiResult
    {
        /// <summary>
        /// 返回狀態碼
        /// </summary>
        public virtual HttpStatusCode HttpStatus { get; set; } = HttpStatusCode.OK;

        /// <summary>
        /// 返回數據
        /// </summary>
        public virtual object Data { get; set; }

        /// <summary>
        /// 獲取 消息內容
        /// </summary>
        public virtual string Message { get; set; }

        /// <summary>
        /// 執行時長
        /// </summary>
        public virtual long TimeOut { get; set; }

 


免責聲明!

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



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