API接口通讯参数规范(2)
针对【API接口通讯参数规范】这篇文章留下的几个问题进行探讨。
问题1
试想一下,如果一个http请求返回一个500给我们,那我们是不是都不用看详情都知道该次请求发生了什么?这正是一个标准的结果码意义所在。在公司所有的系统中,API遵循同一套结果码,那这样同事A在调用同事B的接口时,对于返回的结果码是非常具有可读性的,我们不用面对面交流都知道返回的结果是一个什么样的情况。
XML方案
在此先给出上一篇文章针对Result的另一个方案,是基于XML来定义结果码的,可能有些公司喜欢XML这种配置文件,因为可以不用重新发布应用程序(其实大多数情况下还是需要重新发布的,后面会讲解)。这里面的主要变化是我们不再从枚举ResultCode中获取提示信息,这些提示信息会放在XML上,看看我们的Result中的Message属性的变化
/// <summary>
/// 结果消息
/// </summary>
public string Message
{
get { return _message ?? XmlResultCodeHelper.GetResultMsg((int)Code); }
set { _message = value; }
}
看看我们的这个帮助类
/// <summary>
/// xml结果码帮助类
/// </summary>
public class XmlResultCodeHelper
{
private static List<XmlResultCode> xmlResultCode = new List<XmlResultCode>(); //获取xml里面对应的msg
public static string GetResultMsg(int key)
{
if (xmlResultCode.Count==)
{
dynamic type = (new ErrorCodes()).GetType();
string currentDirectory = Path.GetDirectoryName(type.Assembly.Location);
string path = currentDirectory + "\\XmlResultCodes.xml";
xmlResultCode= path.XmlDeserializeFromFile<List<XmlResultCode>>();
} var code = xmlResultCode.FirstOrDefault(q => q.Code == key);
if(null == code)
throw new InvalidOperationException("没有配置对应的xml节点");
return code.Msg;
} } /// <summary>
/// xml结果码
/// </summary>
public class XmlResultCode
{
public int Code { get; set; } public string Msg { get; set; }
}
这个类主要是帮助我们获取到XmlResultCodes.xml并且返回里面对应的msg,这方法里面的xml反序列方法我就不再贴出来了,大家百度一下即可。
看一下我们的XmlResultCodes.xml,这里看得出是一个键值对
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfErrorCode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ErrorCode>
<Code></Code>
<Msg>操作成功</Msg>
</ErrorCode>
<ErrorCode>
<Code></Code>
<Msg>操作失败</Msg>
</ErrorCode>
<ErrorCode>
<Code></Code>
<Msg>登陆失败</Msg>
</ErrorCode>
<ErrorCode>
<Code></Code>
<Msg>参数不正确</Msg>
</ErrorCode>
<ErrorCode>
<Code></Code>
<Msg>用户不存在</Msg>
</ErrorCode>
<ErrorCode>
<Code></Code>
<Msg>没有数据</Msg>
</ErrorCode>
</ArrayOfErrorCode>
再看看我们这个ResultCode枚举,对比上篇文章,已经不需要DisplayAttribute了
public enum ResultCode
{
/// <summary>
/// 操作成功
///</summary>
Ok = , /// <summary>
/// 操作失败
///</summary>
Fail = , /// <summary>
/// 登陆失败
///</summary>
LoginFail = , /// <summary>
/// 参数不正确
///</summary>
InvalidParams = , /// <summary>
/// 用户不存在
///</summary>
NoSuchUser = , /// <summary>
/// 没有该数据
///</summary>
NoRecord = , }
那这种情况ResultCode对我们的意义是什么呢?且看下面例子
//情况1
return Result.FromCode(); //情况2
return Result.FromCode(ResultCode.InvalidParams);
我们虽然英文口语不一定流利:),但是凭借我们的睿智,肯定会让我们选择情况2使程序具有更高的可读性,不然新人接手项目,吐槽是少不了的,难保自己过了段时间再看这样的设计,这返回的13是什么鬼?
OK,XML的方案基本可以了,总结一下步骤:
1. 在ResultCode中定义好自己的英文(使程序具有更高的可读性)和对应枚举的数值
2. 在XmlResultCodes.xml中定义这个数值对应的提示信息
同样我们也会审视这个设计方案的问题所在:为什么会采用XML?就是冲着不用重新发布嘛。是的,改提示信息是可以不用重新发布,但是在xml里面添加了新的节点呢?添加了之后我们得用啊,一样要在业务中调用这个新的节点,还不是一样要重新发布?这样看来我们基于这个XML的设计方案并没有完全达到我们的初衷的。
怎么办?且看下面的问题。
问题2
我们如何做到统一呢?中心式的管理,在管理后台中,把所有的结果码和对应的消息都写入数据库,然后通过Redis加载作为缓存,在获取提示信息的时候访问Redis返回我们需要的信息。
public class ResultCodeHelper
{
public static string GetResultMsg(int key)
{
//从redis数据库根据key获取到value
}
}
这里只是伪代码,大家根据自己的Redis的熟知情况设计方案。
现在这个ResultCode的增删改都只能让管理员在管理后台操作了,开发人员最好是有权限能查看到ResultCode的所有结果码和信息,这样在新增之前才能知道是否存在类似的结果码进而避免重复。修改和删除结果码?最好不要,你有见过Http状态码的更改吗?这种公司级别的通讯规范,作为基础设施架构就最好先设计和定义,后续项目多起来,都可以有据可依。
来看一下我们结果码定义和使用的流程:
1. ResultCode在管理后台的定义和储存
2. 加载到Redis并获取对应值的信息
3. 每个项目都定义好自己的ResultCode对应的枚举和值(使程序具有更高的可读性)
至此我们通过DisplayAttribute和XML获取提示信息这两种方案都已经被分布式缓存Redis方案代替了,我们做了那么多,并且耦合了Redis缓存,这样做究竟有什么好处呢?就像我们的标题阐述的主题一样,规范!规范会让后续的项目管理花费更少的effor。
让我知道如果你有更好的想法!
API接口通讯参数规范(2)的更多相关文章
- API接口通讯参数规范
通常在很多的公司里面,对于接口的返回值没做太大规范,所以会比较常看到各个项目各自定义随意的返回值,比如以下情况: 1. 直接返回bool值(True或者False) 2. 返回void,只要不是异常信 ...
- Restful API 接口设计标准及规范
Restful API 接口设计标准以及规范 RESTful概念 理解和评估以网络为基础的应用软件的架构设计,得到一个功能强.性能好.适宜通信的架构.REST指的是一组架构约束条件和原则." ...
- API接口防止参数篡改和重放攻击
{近期领导要求我对公司业务的支付类的ocr接口做研究,是否存在支付接口重放攻击,so.....} API重放攻击(Replay Attacks)又称重播攻击.回放攻击.他的原理就是把之前窃听到的数据原 ...
- RESTful API接口文档规范小坑
希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 前后端分离的开发模式,假如使用的是基于RESTful API的七层通讯协议,在联调的时候,如何避免配合过程中出现问 ...
- 如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)- 续(附demo)
上篇文章说到接口安全的设计思路,如果没有看到上篇博客,建议看完再来看这个. 通过园友们的讨论,以及我自己查了些资料,然后对接口安全做一个相对完善的总结,承诺给大家写个demo,今天一并放出. 对于安全 ...
- Spring框架学习笔记(9)——API接口设计相关知识及具体编码实现
最近需要设计一个API服务器,想要把API接口搞得规范一下,就通过网上搜集到了一些资料,以下便是自己的一些理解以及相关的具体实现 本文采用的是spring boot+maven的方案 restful规 ...
- API 接口开发规范
整体规范建议采用RESTful 方式来实施. 协议 API与用户的通信协议,总是使用HTTPs协议,确保交互数据的传输安全. 域名 应该尽量将API部署在专用域名之下.https://api.exam ...
- day71:drf:API接口&Restful API规范&Django Rest Framework&drf中的序列化和反序列化功能
目录 1.web应用模式 2.API接口 3.Restful API规范 4.序列化 5.Django Rest Framework 1.drf的简单介绍 2.drf的特点 3.如何安装drf 4.d ...
- 后端API接口的错误信息返回规范
前言 最近我司要制定开发规范.在讨论接口返回的时候,后端的同事询问我们前端,错误信息的返回,前端有什么意见? 所以做了一些调研给到后端的同事做参考. 错误信息返回 在使用API时无可避免地会因为各种情 ...
随机推荐
- 使用ASIFormDataRequest完成用户的登录操作
ASIFormDataRequest是用于向表单post数据或get数据,可以用于用户向服务器端发送请求完成登录注册,上传下载数据的操作. 之前写过一篇文章是介绍使用ios内置的功能完成登录操作(NS ...
- nodejs-5.1 ejs模板引擎
ejs官方文档:https://ejs.bootcss.com/ 1.什么是 EJS? "E" 代表 "effective",即[高效]. EJS 是一套简单的 ...
- 再谈腾讯云centos服务器不能登录的解决过程
上篇文章谈到腾讯云centos服务器不能登录,通过查看监控信息,cpu使用过高,再腾讯云页面使用VNC方式直接登录,然后根据提示信息,关闭导致内存溢出的进程,从而解决问题. 1 问题再现 昨天刚解决了 ...
- ASP.NET Core2.2+Quartz.Net 实现web定时任务
作为一枚后端程序狗,项目实践常遇到定时任务的工作,最容易想到的的思路就是利用Windows计划任务/wndows service程序/Crontab程序等主机方法在主机上部署定时任务程序/脚本. 但是 ...
- 一个C#程序员学习微信小程序的笔记
客户端打开小程序的时候,就将代码包下载到本地进行解析,首先找到了根目录的 app.json ,知道了小程序的所有页面. 在这个Index页面就是我们的首页,客户端在启动的时候,将首页的代码装载进来,通 ...
- redis一致性hash算法理解
一般算法: 对对象先hash然后对redis数量取模,如果结果是0就存在0的节点上. 1.2同上,假设有0-3四个redis节点.20个数据: 进行取模后分布如下: 现在因为压力过大需要扩容,增加一台 ...
- len(x) 击败 x.len(),从内置函数看 Python 的设计思想
内置函数是 Python 的一大特色,用极简的语法实现很多常用的操作. 它们预先定义在内置命名空间中,开箱即用,所见即所得.Python 被公认是一种新手友好型的语言,这种说法能够成立,内置函数在其中 ...
- FreeSql 如何实现 Sqlite 跨库查询
FreeSql 是 .NetFramework 4.6+..NetCore 下的 ORM 功能库,提供了丰富的功能,支持五种流行数据库 MySql/SqlServer/PostgreSQL/Oracl ...
- 调用pymysql模块操作数据库
1.创建数据库表: def create_table(tb_name): import pymysql#导入模块 #连接数据库 db = pymysql.Connect(','zabbix_db') ...
- Geoserver+Openlayers拉框查询
1.代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" co ...