WebApi返回数据我们一般包裹在一个公共的模型下面的,而不是直接返回最终数据,在返回参数中,显示出当前请求的时间戳,是否请求成功,如果错误那么错误的消息是什么,状态码(根据业务定义的值)等等。我们常规的返回值常需要如下字段,为此我们可以先定义IResultDto 接口

/// <summary>
/// 结果模型
/// </summary>
public interface IResultDto
{
/// <summary>
/// 成功
/// </summary>
bool Successful { get; set; } /// <summary>
/// 返回标识码
/// </summary>
int Code { get; set; } /// <summary>
/// 操作码(用于幂等性验证,每次请求都会返回一个新的,以便用户下次更新使用)
/// </summary>
string OpCode { get; set; } /// <summary>
/// 消息
/// </summary>
string Msg { get; set; } /// <summary>
/// 常规数据
/// </summary>
dynamic Data { get; set; } }
/// <summary>
/// 结果模型
/// </summary>
public interface IResultDto
{
/// <summary>
/// 成功
/// </summary>
bool Successful { get; set; } /// <summary>
/// 返回标识码
/// </summary>
int Code { get; set; } /// <summary>
/// 操作码(用于幂等性验证,每次请求都会返回一个新的,以便用户下次更新使用)
/// </summary>
string OpCode { get; set; } /// <summary>
/// 消息
/// </summary>
string Msg { get; set; } /// <summary>
/// 常规数据
/// </summary>
dynamic Data { get; set; } }

对应的还接口的实现如下,为了更好的独立性,在这里实现了成功和失败赋值方法。

/// <summary>
/// 返回模型
/// </summary>
public class ResultDto : IResultDto
{
/// <summary>
/// 返回标识码
/// </summary>
public int Code { get; set; } /// <summary>
/// 成功
/// </summary>
[JsonIgnore]
public bool Successful { get; set; } /// <summary>
/// 消息
/// </summary>
public string Msg { get; set; } /// <summary>
/// 操作码(用于幂等性验证,每次请求都会返回一个新的,以便用户下次更新使用)
/// </summary>
public string OpCode { get; set; } /// <summary>
/// 常规数据
/// </summary>
public dynamic Data { get; set; } /// <summary>
/// 成功
/// </summary>
/// <returns></returns>
public ResultDto Success(string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Msg = msg;
return this;
} /// <summary>
/// 成功
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto Success(dynamic data = default, string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Data = data;
this.Msg = msg;
return this;
} /// <summary>
/// 成功
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto Success(dynamic data = default, dynamic data2 = default, string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Data = data;
this.Msg = msg;
return this;
} /// <summary>
/// 失败
/// </summary>
/// <param name="code"></param>
/// <param name="msg">说明</param>
public ResultDto Failed(int code = default, string msg = "failed")
{
this.Code = code;
this.Successful = false;
this.Msg = msg;
return this;
} }
/// <summary>
/// 返回模型
/// </summary>
public class ResultDto : IResultDto
{
/// <summary>
/// 返回标识码
/// </summary>
public int Code { get; set; } /// <summary>
/// 成功
/// </summary>
[JsonIgnore]
public bool Successful { get; set; } /// <summary>
/// 消息
/// </summary>
public string Msg { get; set; } /// <summary>
/// 操作码(用于幂等性验证,每次请求都会返回一个新的,以便用户下次更新使用)
/// </summary>
public string OpCode { get; set; } /// <summary>
/// 常规数据
/// </summary>
public dynamic Data { get; set; } /// <summary>
/// 成功
/// </summary>
/// <returns></returns>
public ResultDto Success(string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Msg = msg;
return this;
} /// <summary>
/// 成功
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto Success(dynamic data = default, string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Data = data;
this.Msg = msg;
return this;
} /// <summary>
/// 成功
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto Success(dynamic data = default, dynamic data2 = default, string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Data = data;
this.Msg = msg;
return this;
} /// <summary>
/// 失败
/// </summary>
/// <param name="code"></param>
/// <param name="msg">说明</param>
public ResultDto Failed(int code = default, string msg = "failed")
{
this.Code = code;
this.Successful = false;
this.Msg = msg;
return this;
} }

我们尝试返回该类型结果

 return ResultTo.Success(tokenDto, "登录成功");

通过swagger文档我们看下返回效果

细心的你是不是发现了啥,我们的接口文档他不认识我们返回类型的实体呀,还玩啥,别急我们可以再稍微扩展下,加个泛型的返回,看起来就完美了。

   /// <summary>
/// 泛型结果模型
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IResultDto<T> : IResultDto
{
/// <summary>
/// 常规数据
/// </summary>
new T Data { get; set; } }
    /// <summary>
/// 泛型结果模型
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IResultDto<T> : IResultDto
{
/// <summary>
/// 常规数据
/// </summary>
new T Data { get; set; } }

我们实现泛型接口如下,同样在这里实现了成功和失败赋值方法。

/// <summary>
/// 泛型类 返回模型
/// </summary>
/// <typeparam name="T"></typeparam>
public class ResultDto<T> : ResultDto, IResultDto<T>
{
/// <summary>
/// 常规数据
/// </summary>
public new T Data { get; set; } /// <summary>
/// 成功
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto<T> Success(T data = default, string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Data = data;
this.Msg = msg;
return this;
} /// <summary>
/// 异常
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto<T> Failed(string msg = "err")
{
this.Code = (int)EnumCode.Err;
this.Successful = false;
this.Msg = msg;
return this;
} /// <summary>
/// 异常
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto<T> Failed(string msg, int enumCode)
{
this.Code = enumCode;
this.Successful = false;
this.Msg = msg;
return this;
} }
/// <summary>
/// 泛型类 返回模型
/// </summary>
/// <typeparam name="T"></typeparam>
public class ResultDto<T> : ResultDto, IResultDto<T>
{
/// <summary>
/// 常规数据
/// </summary>
public new T Data { get; set; } /// <summary>
/// 成功
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto<T> Success(T data = default, string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Data = data;
this.Msg = msg;
return this;
} /// <summary>
/// 异常
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto<T> Failed(string msg = "err")
{
this.Code = (int)EnumCode.Err;
this.Successful = false;
this.Msg = msg;
return this;
} /// <summary>
/// 异常
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto<T> Failed(string msg, int enumCode)
{
this.Code = enumCode;
this.Successful = false;
this.Msg = msg;
return this;
} }

我们再次尝试返回该类型结果

  return ResultTo<TokenDto>.Success(tokenDto, "登录成功");

看看swagger文档的显示,正是我们需要的

根据经验我们还要需要返回列表

 /// <summary>
/// 泛型结果模型集合
/// </summary>
public interface IResultListDto<T> : IResultDto
{ /// <summary>
/// 常规数据
/// </summary>
new List<T> Data { get; set; } }
 /// <summary>
/// 泛型结果模型集合
/// </summary>
public interface IResultListDto<T> : IResultDto
{ /// <summary>
/// 常规数据
/// </summary>
new List<T> Data { get; set; } }
 /// <summary>
/// 泛型类 返回模型
/// </summary>
/// <typeparam name="T"></typeparam>
public class ResultListDto<T> : ResultDto, IResultListDto<T>
{ /// <summary>
/// 常规数据
/// </summary>
public new List<T> Data { get; set; } /// <summary>
/// 成功
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultListDto<T> Success(List<T> data = default, string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Data = data;
this.Msg = msg;
return this;
} /// <summary>
/// 异常
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultListDto<T> Failed(string msg = "err")
{
this.Code = (int)EnumCode.Err;
this.Successful = false;
this.Msg = msg;
return this;
} /// <summary>
/// 异常
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultListDto<T> Failed(string msg, int enumCode)
{
this.Code = enumCode;
this.Successful = false;
this.Msg = msg;
return this;
} }
    /// <summary>
/// 泛型类 返回模型
/// </summary>
/// <typeparam name="T"></typeparam>
public class ResultListDto<T> : ResultDto, IResultListDto<T>
{ /// <summary>
/// 常规数据
/// </summary>
public new List<T> Data { get; set; } /// <summary>
/// 成功
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultListDto<T> Success(List<T> data = default, string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Data = data;
this.Msg = msg;
return this;
} /// <summary>
/// 异常
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultListDto<T> Failed(string msg = "err")
{
this.Code = (int)EnumCode.Err;
this.Successful = false;
this.Msg = msg;
return this;
} /// <summary>
/// 异常
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultListDto<T> Failed(string msg, int enumCode)
{
this.Code = enumCode;
this.Successful = false;
this.Msg = msg;
return this;
} }

顺着这个思路,我们可以继续实现分页,多参数返回等等,如果你觉得麻烦,当然也可以直接在nuget直接引用 Sy.ResultExtension,这个组件,苦逼的码农小哥已经为你实现了该功能。

插件化编程之WebAPI统一返回模型的更多相关文章

  1. 深入理解Android插件化技术

    深入理解Android插件化技术  转 https://zhuanlan.zhihu.com/p/33017826 插件化技术可以说是Android高级工程师所必须具备的技能之一,从2012年插件化概 ...

  2. Android插件化技术——原理篇

    <Android插件化技术——原理篇>     转载:https://mp.weixin.qq.com/s/Uwr6Rimc7Gpnq4wMFZSAag?utm_source=androi ...

  3. ASP.NET Core 2.2 WebApi 系列【八】统一返回格式(返回值、模型验证、异常)

    现阶段,基本上都是前后端分离项目,这样一来,就需要前后端配合,没有统一返回格式,那么对接起来会很麻烦,浪费时间.我们需要把所有接口及异常错误信息都返回一定的Json格式,有利于前端处理,从而提高了工作 ...

  4. webapi接口统一返回请求时间

    webapi接口统一返回请求时间: public class BaseController : ControllerBase { protected ReturnResult<T> Res ...

  5. 基于 abp vNext 和 .NET Core 开发博客项目 - 统一规范API,包装返回模型

    上一篇文章(https://www.cnblogs.com/meowv/p/12916613.html)使用自定义仓储完成了简单的增删改查案例,有心的同学可以看出,我们的返回参数一塌糊涂,显得很不友好 ...

  6. Python Flask高级编程之RESTFul API前后端分离精讲 (网盘免费分享)

    Python Flask高级编程之RESTFul API前后端分离精讲 (免费分享)  点击链接或搜索QQ号直接加群获取其它资料: 链接:https://pan.baidu.com/s/12eKrJK ...

  7. 【Java】网络编程之NIO

    简单记录 慕课网-解锁网络编程之NIO的前世今生 & 一站式学习Java网络编程 全面理解BIO/NIO/AIO 内容概览 文章目录 1.[了解] NIO网络编程模型 1.1.NIO简介 1. ...

  8. 异步编程之Generator(2)——剖析特性

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  9. Android 全面插件化 RePlugin 流程与源码解析

    转自 Android 全面插件化 RePlugin 流程与源码解析 RePlugin,360开源的全面插件化框架,按照官网说的,其目的是“尽可能多的让模块变成插件”,并在很稳定的前提下,尽可能像开发普 ...

随机推荐

  1. gitlab+jenkins自动构建jar包并发布

    一.背景介绍: 公司软件都是java开发的,一般都会将java代码打包成jar包发布:为了减轻运维部署的工作量,合理偷懒,就需要自动化流程一条龙服务:开发将代码提交到gitlab--->jenk ...

  2. 题解 P4999 【烦人的数学作业】

    数位 dp. 设 \(dp_{q,i}\)(\(i\in\{0,1,2,3,4,5,6,7,8,9\}\))为 \(1\sim q\) 中 \(i\) 出现的次数,\(1\sim q\) 的数字和显然 ...

  3. python对象的独有功能与面向对象的特征

    目录 对象的独有功能 动静态方法 面向对象的特征 面向对象的的三大特征 继承的本质 不继承的名字查找顺序 单继承的名字查找顺序 多继承的名字查找顺序 经典类与新式类 派生方法 对象的独有功能 1.定义 ...

  4. 智慧文旅IOC大数据可视化建设方案

    一.建设背景 自2020年以来,疫情对各行各业的都造成了不同程度的影响,对依赖人口消费实现商业价值的文旅行业更是受到了更大的冲击,因此在疫情当下以及科技发达的今天,如何利用科技的手段赋能文旅行业进行数 ...

  5. 【活动专辑】Gitee X DolphinScheduler 邀你一起参与 issue 解决赢好礼!

    在你参与 DolphinScheduler 项目开发时,是否曾因为这些问题困惑: 对项目感兴趣,但不清楚自己可以为项目做什么 在众多 issue 中,找不到合适自己参与的 issue 任务 认为参与开 ...

  6. Dart 导包时类名冲突

    import 'package:qingyuo_mobile/pages/slices/home_page/tech_slice.dart'; import 'package:qingyuo_mobi ...

  7. 痞子衡嵌入式:浅析IAR下调试信息输出机制之硬件UART外设

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之硬件UART外设. 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我们可以比较容易地 ...

  8. 微软Azure配置中心 App Configuration (二):Feature Flag 功能开关特性

    写在前面 Web服务开发过程中我们经常有这样的需求: 某些功能我必须我修改了配置才启用,比如新用户注册送券等: 某个功能需到特定的时间才启用,过后就失效,比如春节活动等: 某些功能,我想先对10%的用 ...

  9. 使用自定义隐式转换快速创建失败Result

    系统要求方法都返回 Result 结果,通常我们会如此定义一个 Result 1 public class Result<T> 2 { 3 public virtual int Code ...

  10. Spring MVC组件之HandlerAdapter

    Spring MVC组件之HandlerAdapter HandlerAdapter概述 HandlerAdapter组件是一个处理器Handler的适配器.HandlerAdapter组件的主要作用 ...