插件化编程之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开源的全面插件化框架,按照官网说的,其目的是“尽可能多的让模块变成插件”,并在很稳定的前提下,尽可能像开发普 ...
随机推荐
- 获取字典中values值中最大的数,返回对应的keys
1.字典中键值对的获取 print(data.values()) # 查看字典的值 print(data.keys()) # 查看字典的key 2.对字典中的值进行排序 sorted(data.val ...
- vue项目导航菜单实现
vue项目导航菜单问题 目标:横向菜单点击跳转,颜色变换,刷新可保持状态 // 模板template中通过循环菜单列表生成,动态类名改变颜色 <li v-for="(item, ind ...
- Docker 好用的镜像
Docker 官方镜像 1.个人博客空间wordpress 2.开源管理系统odoo 3.开发文档生成工具star7th/showdoc.(启动说明文档https://www.showdoc.com. ...
- JPA作持久层操作
JPA(Hibernate是jpa的实现) jpa是对实体类操作,从而通过封装好的接口直接设置数据库的表结构.虽然jpa可以直接通过编写java代码来操作数据库表结构,避免了sql的编写,但别忘了需要 ...
- Computational Protein Design with Deep Learning Neural Networks
本文使用深度神经网络完成计算蛋白质设计去预测20种氨基酸概率. Introduction 针对特定结构和功能的蛋白质进行工程和设计,不仅加深了对蛋白质序列结构关系的理解,而且在化学.生物学和医学等领域 ...
- MySQL之COUNT(*)性能到底如何?
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 前言 在实际开发过程中,统计一个表的数据量是经常遇到 ...
- 学习ASP.NET Core Blazor编程系列一——综述
一.NET 6概述 .NET 6 是微软统一.Net Core与.Net Framework 两大框架的第二个版本,微软在 .NET 5 中开始进行这两大框架的统一之路. .NET 6 将作为长期支持 ...
- windows优化原神
原神3.0新地图很卡顿? 锐距显卡带不动? 看一下我的配置 英特尔i5-1135G7 内存16GB可以拓展32GB 固态512GB 原神优化前帧率50左右 优化后59-60最差55 展示图原神设置图 ...
- KingbaseES R6 集群修改物理IP和VIP案例
在用户的实际环境里,可能有时需要修改主机的IP,这就涉及到集群的配置修改.以下以例子的方式,介绍下KingbaseES R6集群如何修改IP. 一.案例测试环境 操作系统: [KINGBASE@nod ...
- 【ajax】发送请求 —— 结合【express】框架 { }
1.先用 express 框架搭建一个简单的服务器 (1)在文件夹上点击右键,点击"在集成终端中打开" (2)使用"npm i express"命令安装[exp ...