插件化编程之WebAPI统一返回模型
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统一返回模型的更多相关文章
- 深入理解Android插件化技术
深入理解Android插件化技术 转 https://zhuanlan.zhihu.com/p/33017826 插件化技术可以说是Android高级工程师所必须具备的技能之一,从2012年插件化概 ...
- Android插件化技术——原理篇
<Android插件化技术——原理篇> 转载:https://mp.weixin.qq.com/s/Uwr6Rimc7Gpnq4wMFZSAag?utm_source=androi ...
- ASP.NET Core 2.2 WebApi 系列【八】统一返回格式(返回值、模型验证、异常)
现阶段,基本上都是前后端分离项目,这样一来,就需要前后端配合,没有统一返回格式,那么对接起来会很麻烦,浪费时间.我们需要把所有接口及异常错误信息都返回一定的Json格式,有利于前端处理,从而提高了工作 ...
- webapi接口统一返回请求时间
webapi接口统一返回请求时间: public class BaseController : ControllerBase { protected ReturnResult<T> Res ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 统一规范API,包装返回模型
上一篇文章(https://www.cnblogs.com/meowv/p/12916613.html)使用自定义仓储完成了简单的增删改查案例,有心的同学可以看出,我们的返回参数一塌糊涂,显得很不友好 ...
- Python Flask高级编程之RESTFul API前后端分离精讲 (网盘免费分享)
Python Flask高级编程之RESTFul API前后端分离精讲 (免费分享) 点击链接或搜索QQ号直接加群获取其它资料: 链接:https://pan.baidu.com/s/12eKrJK ...
- 【Java】网络编程之NIO
简单记录 慕课网-解锁网络编程之NIO的前世今生 & 一站式学习Java网络编程 全面理解BIO/NIO/AIO 内容概览 文章目录 1.[了解] NIO网络编程模型 1.1.NIO简介 1. ...
- 异步编程之Generator(2)——剖析特性
异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...
- Android 全面插件化 RePlugin 流程与源码解析
转自 Android 全面插件化 RePlugin 流程与源码解析 RePlugin,360开源的全面插件化框架,按照官网说的,其目的是“尽可能多的让模块变成插件”,并在很稳定的前提下,尽可能像开发普 ...
随机推荐
- 搞懂前端二进制系列(二):🍈File、FileReader与Base64
参考资料: JavaScript高级程序设计第四版:File API https://juejin.cn/post/7046313942938812424[前端二进制一次搞清楚] 一.File 类型 ...
- PHP memcache add replace set的区别和其他用法收集
add replace set的区别 最近在面试时遇到一个问题 memcache 的add replace set的区别,故在此进行加强 add 是向服务器添加一个缓存的数据,当该键已存在会返回一个f ...
- Win10环境前后端分离项目基于Vue.js+Django+Python3实现微信(wechat)扫码支付流程(2021年最新攻略)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_182 之前的一篇文章:mpvue1.0+python3.7+Django2.0.4实现微信小程序的支付功能,主要介绍了微信小程序内 ...
- 构建数据湖上低延迟数据 Pipeline 的实践
T 摘要 · 云原生与数据湖是当今大数据领域最热的 2 个话题,本文着重从为什么传统数仓 无法满足业务需求? 为何需要建设数据湖?数据湖整体技术架构.Apache Hudi 存储模式与视图.如何解决冷 ...
- 客户流失?来看看大厂如何基于spark+机器学习构建千万数据规模上的用户留存模型 ⛵
作者:韩信子@ShowMeAI 大数据技术 ◉ 技能提升系列:https://www.showmeai.tech/tutorials/84 行业名企应用系列:https://www.showmeai. ...
- Word 常识备忘录
一句科普 名词解释 左右页边距 正文到纸左右两边之间的间距. 分页符 分页符是分页的一种符号,上一页结束以及下一页开始的位置. 分栏符 分栏的页面使用分栏符可以使一列分栏的段落排列到另一栏. 邮件合并 ...
- Vite + TS 项目导入 jQuery 包时报错:Could not find a declaration file
TypeScript 需要类型标注,当使用第三方库(除 ts 以外写的库,即 js)时,又缺少声明文件,我们需要引用它的声明文件,才能获得对应的代码补全.接口提示等功能.jQuery 不是 TypeS ...
- Canvas 非常重要的三个函数
beginPath 绘制路径必须添加 beginPath().它标志着一个画笔在画布中哪个地方开始画起.没有它,新起的画笔位置必定与上一次画笔结束的位置相连. // 第一个半圆 ctx.arc(60, ...
- 【Java】学习路径59-多个连接的服务器端
ServerSocket可以对接多个Socket对象,利用这点,就可以实现:一台服务器对多个客户端. import java.io.IOException; import java.net.*; pu ...
- Html飞机大战(八):子弹的移动和管理
好家伙,这应该是这个小游戏最难的几个点之一了 现在我们要做出子弹射击的效果我们应该如何处理? 1.首先我们要确定几个变量和方法的关系 变量: 子弹 bullet 弹夹(用来装子弹的东西)bulle ...