设计一个接口务必考虑好这14个基本点

news2024/12/23 14:08:46

目录:导读

 前言

1、入参合法性校验

2、接口的版本控制

3、接口考虑幂等性

4、接口考虑防止重复请求

5、提高接口的响应时间

6、接口限流控制

7、黑白IP白名单

8、敏感数据脱敏

9、请求接口的先决条件-token

10、记录接口请求日志

11、调用第三方接口要考虑异常、超时、重试

12、统一响应数据格式

13、接口单一职责

14、接口文档的可读性


 前言

在我们日常开发中设计一个接口的步骤大致如下:

Controller层定义接口url、请求方式、入参、统一格式的出参。然后在Service层去定义接口和实现类,这样一个接口就算完成了。

当然我们还需要考虑很多东西,比如接口的规范性安全性可扩展性稳定性等等。

这篇文就来整理下 设计一个良好的接口需要考虑哪些点呢?

1、入参合法性校验

入参的合法性校验是一个良好的接口必备的前提条件,通过入参的校验我们可以过滤掉许多无效的请求,提高系统的稳定性。

我们可以将入参合法性校验分为: 常规性校验 和 业务校验;

所谓的常规性校验包括:token校验、必填校验、长度校验、类型校验等等;

业务校验也就是特定业务场景下的校验:比如用户商品下单接口,那么下单金额一定要大于0;

有关参数校验请找我之前写的文章

2、接口的版本控制

我们在开发小程序或者app的时候,都需要对版本进行升级,而提前设计好版本,可以避免因为升级导致旧的服务无法正常工作,我们要保证在升级的时候,新旧版本的服务都能正常运转。

多版本控制现在比较常见的方式有:url标识版本header标识版本params标识版本3种方式。

后台接口:

 @RequestMapping("test/v{d}/hello")
    public String hello(@PathVariable("id") Integer id){
        //根据不同版本,执行不同逻辑
        return "成功";
    }

基于url标识版本不友好的点在于,对于前端工程师来说会比较麻烦,必须在每个请求的URL上标记一个版本号来使用对应的版本的API。

更友好的方式就是,前端只需要传一个当前APP的版本号,后端根据前端传过来的版本号,自动匹配到对应的版本API接口。

3、接口考虑幂等性

所谓幂等: 多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致

我们在开发中主要操作也就是CURD,其中读取操作和删除操作是天然幂等的,我们所关心的就是创建操作、更新操作。

创建操作一定是非幂等的因为要涉及到新数据的产生,而更新操作有可能幂等有可能非幂等,这个要看具体业务场景。

有关接口如何保证幂等之前有写过6种常见解决办法:

4、接口考虑防止重复请求

防重和幂等的概念其实很像,上面保证幂等的解决方案同样适用于防止重复请求。

它们的区别在于:

防重

防重的目的是防止重复数据的产生,比如新增接口,用户快速点击两次,如果没做防重,就会产生重复数据。

幂等

比如请求多次,只有第一次请求才会做数据处理,后面的请求不会产生数据改变,例如退款接口,第一次退款成功后,后面的请求,不会再次退款成功。

5、提高接口的响应时间

1)、数据库查询尽量走索引,优化查询速度。

2)、是否考虑需要添加缓存:本地缓存、redis缓存、es存储等等。

3)、是否考虑走异步操作、多线程、mq消息队列等一些方式,提高接口的响应速度。

6、接口限流控制

限流是为了更好的维护系统稳定性。如果说我们把接口提供出来给第三方系统用,那么这个时候接口的限流是非常有必要的。

一方面,限流可以防止接口被刷,造成不必要的服务层压力,另一方面,是为了防止接口被滥用。

可以使用redis进行接口调用次数统计,ip+接口地址作为key,访问次数作为value,每次请求value+1,设置过期时长来限制接口的调用频率。

7、黑白IP白名单

ip白名单是指将接口的访问权限对部分ip进行开放。这样就能避免其他ip进行访问攻击。

ip黑名单是设置不能通过的ip,黑名单以外的ip都能通过。

显然白名单比黑名单限制的要更多一些。

设置ip白名单比较麻烦的一点就是当你的客户端进行迁移后,就需要重新联系服务提供者添加新的ip白名单。

设置ip白名单的方式很多,除了传统的防火墙之外,spring cloud alibaba提供的组件sentinel也支持白名单设置。

为了降低api的复杂度,推荐使用防火墙规则进行白名单设置。

8、敏感数据脱敏

在接口调用的过程中,可能会涉及一些敏感字段比如:身份证号银行卡号地址手机号等等,这些数据通常需要做脱敏处理,比如手机号15912345678脱敏后显示159****5678。

9、请求接口的先决条件-token

它的大致流程是这样的,首先用户登陆成功后,生成一个token返回前端。同时后端将这个token作为key, value为用户信息存入redis缓存中。

那么以后访问其它接口的时候,在请求头带上这个token请求接口,后端通过拦截器拦截该接口,做校验看redis是否存在该key,如果不存在直接返回,用户未登陆!

当然有些接口想不登陆就可以访问比如注册接口,那将拦截器过滤这些接口就可以了。

10、记录接口请求日志

关键的接口一定要有日志,入参日志出参日志异常日志,这样一旦出现问题,我们可以通过查看日志一下子定位问题所在。

当然如果觉得这样打印的日志太多了,我们可以设置日志级别,在特定的情况下才打印该种级别日志。

如果是我们把接口提供出来给第三方系统用,那么每一次请求过来,我们都要记录好请求入参出参、包活它们给的唯一标识ID.如果第三方反馈有问题,只要给到我们此次请求的唯一标识ID,我们通过这个ID,查询它这一次请求的完整链路,这样一来方便排查定位问题,二来如果不是我们接口的问题,日志也是证据,不用在扯皮了。

11、调用第三方接口要考虑异常、超时、重试

不论是我们将接口提供给第三方还是说我们请求第三方接口,我们所需考虑的都要多点,调第三方接口首先考虑就是超时、异常、重试。

超时

我们没法确定第三方接口多久返回,所以我们应该设置个超时时间,保证我们这边接口不被卡死。

异常

是接口都有可能出现异常,调第三方接口异常了,日志肯定要有,同时要考虑是重试还是告警处理。

重试

调第三方接口如果失败了,可能是网络的原因,需不需要重试?重试几次都是需要考虑的。

12、统一响应数据格式

在开发中,我们在定义接口时需要返回统一格式的响应体,响应数据会包含三个属性: 状态码(code),信息描述(message),响应数据(data)。

客户端可以根据状态码可以快速接口请求是否成功,如果成功则开始处理数据,如果失败则直接抛出message信息。

13、接口单一职责

单一职责,接口功能明确单一,不是为了省事,各种融于;在明确接口职责的条件下,尽量做到接口单一,即一个接口只做一件事,而非两件以上。

很多非资深接口设计者,在设计接口时,总认为接口所做的事越多,越牛叉,这是非常严重的错误认识。

14、接口文档的可读性

无论我们的接口设计得多么规范,多么易懂,我们都需要提供一份完整的api文档,同时我们还需要提供一些请求范例,这样用户在使用的时候才会更加清楚,也能避免一些错误的请求。

写在最后

这篇贴子到这里就结束了,最后,希望看这篇帖子的朋友能够有所收获。

都到这了记得三连支持一下吧。

-------------------------------------------------

完整版文档下载方式:

这些资料,对于从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享。

在评论区和我互动交流或者私❤我【软件测试学习】领取即可,拿走不谢。

-------------------------------------------------

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/99892.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分解优化react对redux的基础使用

之前写了 react18 通过redux 做一个简单的状态管理基站 但代码确实相对比较乱 这次进行一些小封装和分解 优化一下管理质量 首先 我们创建一个 react项目 然后在项目中引入 npm install redux --save在src目录下创建 reducers 文件夹 下面创建 counter.js counter.js 参考代码…

有什么免费python安装包?

前言 Python的安装涉及到:Python编辑器、Python解释器、Python包管理工具(pip)。因此,首先我们要搞清楚这三个东西都是啥。 Python编辑器 正如在电脑上编辑文档需要用Word、处理数据需要用Excel、做演示文稿需要用PPT、修图需要…

git add 命令详解

1. 前言 2. git add 基本操作 3. git add 命令参数 4. git add 背后做了什么 1. 前言 众所周知,git 中有工作区、暂存区、版本库三大组成部分 工作区: 电脑中能看到的目录,也就是写代码的地方 暂存区: 英文叫 stage 或 index。一般存放在 .git 目录下…

【图像分割】灰狼算法最小交叉熵多阈值图像分割【含Matlab源码 903期】

⛄一、最小交叉熵多阈值图像分割简介 1 单阈值分割 设有两个概率分布P{p1, p2, …, pN}和Q{q1, q2, …, qN}, 交叉熵度量它们之间的信息量差异。其对称形式为 交叉熵既可看成是采用P取代Q作为单个系统概率分布时系统信息量变化的期望值, 也可看成是两个概率系统P和Q之间的信息…

CSAPP-Lab5 CacheLab解析

Review Cache Struct A cache is a set of 2s2^s2s cache setsA cache set is a set of E cache lines if E1, it is called “direct-mapped” Each cache line stores a blockTotal Capacity S * B * E 由此,我们可以写出cache line和cache的结构: …

微服务框架 SpringCloud微服务架构 服务异步通讯 50 消息可靠性 50.4 失败重试机制 50.4.1 消费者失败重试

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 服务异步通讯 文章目录微服务框架服务异步通讯50 消息可靠性50.4 失败重试机制50.4.1 消费者失败重试50 消息可靠性 50.4 失败重试机制 50…

可路由计算引擎实现前置数据库

❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主&#x1f3…

非零基础自学Golang 第9章 结构体 9.1 理解结构体 9.2 定义结构体 9.3 实例化结构体

非零基础自学Golang 文章目录非零基础自学Golang第9章 结构体9.1 理解结构体9.2 定义结构体9.3 实例化结构体9.3.1 标准实例化9.3.2 new函数实例化9.3.3 取地址实例化9.3.4 访问成员第9章 结构体 在Go语言官网的常见问题解答一栏中,有这样一个问题:“Is…

Fiddler(7):fiddler设置弱网测试

弱网测试 概念:弱网看字面意思就是网络比较弱,我们通称为信号差,网速慢。 意义:模拟在地铁、隧道、电梯和车库等场景下使用APP ,网络会出现延时、中断和超时等情况。 Fiddler弱网测试流程: 一、限速操作…

基于云开发的微信小程序、QQ小程序详细教程(更新中)

云开发解决方案 小程序云开发解决方案 为企业和开发者提供一站式后端云服务,无需管理基础架构,一次开发多端运行,腾讯云和微信联合出品。 云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环…

数据结构---大整数相加

大整数相加列竖式运算第一步第二步第三步第四步JAVA实现给出两个很大的整数,要求实现程序求出两个整数之和。 记得这个题目我大二ACM课程老师讲过,但是忘记了。。。。。。。。。。 列竖式运算 程序不可能通过一条指令计算出两个大整数之和,…

【学习打卡04】可解释机器学习笔记之Grad-CAM

可解释机器学习笔记之Grad-CAM 文章目录可解释机器学习笔记之Grad-CAMGrad-CAM介绍Grad-CAM是CAM的泛化形式Gard-CAM可视化结果Grad-CAM算法的优点Grad-CAM算法的缺点Grad-CAM变种Grad-CAMScore-CAMLayer-CAM思考与总结参考阅读首先非常感谢同济子豪兄拍摄的可解释机器学习公开…

SAP S4 FICO 固定资产模块后台配置详解

1. 概述 资产会计(FI-AA)作为总帐模块(FI-GL)的子分类帐,对企业的固定资产、无形资产、在 建工程、低值易耗品、长期待摊、从购置、资本化、折旧、调拨到出售/报废的整个生命周期 进行全过程的管理,并和…

java实现给微信群中定时推送消息

大家好,我是雄雄。 前言 上一篇,我们介绍了如何通过调用接口的方式,将每日新闻发送到自己的博客中。我们会发现,将新闻以文章的形式发布,并且相关内容按照markdown的形式进行格式调整,有需要的可以点击这里…

获取小程序生产、开发、体验等环境、版本信息、appid等信息

if (typeof __wxConfig "object"){const version __wxConfig.envVersion;console.log("当前环境:" version)if (version "develop"){cosole.log(测试 开发环境)}else if (version "trial"){cosole.log(测试 体验版)}else if (versio…

【电力系统】基于YALMIP+CPLEX求解带储能的微电网优化调度问题附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

【树莓派不吃灰】兄弟连篇② 文件编辑器vim与RPM软件包管理、yum

目录1、文件编辑器Vim1.1 工作模式1.2 插入命令1.3 定位命令1.4 删除命令1.5 复制和剪切命令1.6 替换和取消命令1.7 搜索和搜索替换命令1.8 保存和退出命令1.9 使用技巧2、yum包管理2.1 网络yum源2.2 yum命令2.3 rpm包与源码包安装位置❤️ 博客主页 单片机菜鸟哥,一…

联盛德W801开发板流水灯示例

联盛德W801开发板流水灯示例📺📽🎞🎬本实验通过利用开发板中间的7个led,控制对应的IO实现流水灯效果。 📜W801 32位WiFi蓝牙双模SoC开发板 🛠开发工具以及示例Demo工程 参考:《W801…

【数学模型】基于ARMR模型模拟风速附matlab完整代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

图计算的学习与思考

好的软件不是靠程序分析、查错查出来的,而是由正确的人构建出来的。图成为日益重要的运算对象,图结构是对群体关系的一种抽象,可以描述丰富的对象和关系。图计算的核心是如何将数据建模为图结构以及如何将问题的解法转化为图结构上的计算问题…