API接口设计的18条规范

API接口设计的18条规范

签名

目的:防止数据被篡改

实现方法:

  1. 接口请求方将请求参数、时间戳和密钥拼接成一个字符串
  2. 使用MD5等hash算法生成签名sign
  3. 在请求参数或请求头中增加sign参数,传递给API接口
  4. API接口网关服务验证传递的sign值,与自己生成的sign值对比,若相等则认为是有效请求

时间戳的作用:防止同一次请求被反复利用,增加密钥未破解的可能性,每次请求设置合理的过期时间,如15分钟。

加密

目的:保护敏感数据,如密码、银行卡号等

实现方法:

  1. 使用AES对称加密算法
  2. 在前端使用公钥加密用户密码
  3. 在注册接口中使用密钥解密并做相关校验

加密方式的选择有很多,如AES, RSA等等,可以根据自己实际需要选择合适的加密方式。

IP白名单

目的:防止恶意请求
实现方法:

  1. 限制请求IP
  2. 添加IP白名单在API网关服务上
  3. 防止内部服务器被攻破,需增加WAF (web防火墙软件,如ModSecurity、OpenWAF等)

限流

目的:限制单位时间内用户的请求数量,防止API接口被频繁调用导致服务不可用。
实现方法:

  1. 对请求IP、请求接口、请求用户做限流
  2. 使用nginx,redis,gateway ,sentinel 等技术实现限流功能

请求方式

目的:根据实际业务,选择合适的请求方式,如restful风格或自定义风格等等,怎么合适怎么来

具体方法:

  1. 不建议让前端做主选择api请求方式,(之前遇到过不靠谱的前端非要求后端把一个删除接口从delete请求改成get接口,争论几番后原来是他不太会用axios就给后端找事)
  2. 个人建议,如果是非常简单的CRUD业务,可以使用restful风格,如 查询/分页接口用GET ,添加/新增接口POST ,修改/更新接口用PUT ,删除接口用 DELETE
  3. 遇到一些特殊的业务接口,如发布按钮,用POST请求,带上时间戳和其他请求参数;
  4. 再比如 前端有一个下拉框接口,下拉选择时要支持动态手输新增item (可以参考elementUI中的下拉框组件高级特性),这个时候对后端就有高要求了,要一个接口既支持返回arraylist ,也支持传入一个新item值,当前端没传item值,返回现有的arraylist,当前端输入了一个item值,后端先添加这个item值到数据库,再执行查询返回最新的arraylist给前端,这个后端逻辑不难,但是要注意得用POST接口实现,来标识该接口所做的业务是非幂等的。

参数校验

目的:拦截无效请求,保护系统资源
实现方法:

  1. 校验字段是否为空、字段类型、字段长度、枚举值等
  2. 使用Hibernate Validator 等框架进行参数校验,使用注解如 (@NotNull @NotBlank @NotEmpty @Size @Max @Min等)对字段进行限制。

请求头设计

目的:将公共参数放入请求头中,便于后端统一拦截处理

实现方法:

  1. 前端登录成功后,让前端把jwt放到请求头里,后续再请求后端,后端就可以知道请求的用户等信息
  2. 一些重要的业务请求,让前端在请求头里加上traceId,便于后端做幂等处理
  3. 一些重要的资源,若没有规定的特殊的请求头,不允许上传或下载
  4. 一些对外开放的openApi ,限定外部请求时必须加上规定的请求头来做权限验证和请求来源识别
  5. 可以通过请求头中的user-agent来限定请求来源,如禁止PC端访问,只允许手机端访问

统一异常返回

目的: 避免异常返回结构不统一,便于接口维护
实现方法:

  1. 法一–在SpringBoot中使用GlobalExceptionHandler处理全局异常
  2. 法二–项目中有网关如SpringGateway时,所有异常通过API网关捕获并转换成统一的异常结构返回

统一封装返回

目的:以相同格式返回数据,便于前端接收处理,节省前端数据转换处理的代码

实现方法:
构造一个如下2种格式的json返回封装

{
"code": 20001,  //业务返回码
"success": true, //标识请求成功/失败
"message": "查询数据成功",  //返回的业务处理消息提示
"timestamp" : 1718506205 , //时间戳
"result" : [  ]  //返回的数组数据,array内部还可以继续有obj
}
{
"code": 20001,  //业务返回码
"success": true, //标识请求成功/失败
"message": "查询数据成功",  //返回的业务处理消息提示
"timestamp" : 1718506205 , //时间戳
"result" : {    //返回的对象数据,obj内部还可以继续有array
    "age":28 , "hobby":["reading","working"]
     } 
}

请求日志

目的:便于快速分析和定位问题
实现方法:

  1. 使用过滤器、拦截器或AOP实现记录请求URL、参数、请求头、请求方式、响应数据、响应时间
  2. 使用traceId 在整个请求日志中打标记,(可以参考我之前的文章 利用MDC实现日志打点 )https://blog.csdn.net/ThinkPet/article/details/131056402
  3. 也可以把日志转发到ELK中,后续在Kibana平台可视化查看日志

幂等设计

目的:防止多次请求产生错误数据
实现方法:

  1. 使用数据库唯一索引或redis保存requestId和请求参数来保证幂等性
  2. 如果使用了MQ组件,要在发送的mq消息内容中自定义messageId 即业务消息id ,并利用本地消息表来实现最终一致性

限制请求的数据量

目的:避免接口超时问题
实现方法:

  1. 限制查询接口请求查询的数据量(如一次最多返回30条记录)
  2. 限制批量保存接口入参的数据量(如一次最多同时保存5条)
  3. 超过限制直接提示用户

压测

目的:了解各接口的QPS情况,确保上线后的稳定性

实现方法:

  1. 使用Jmeter 或wrk 等测试工具进行压力测试
  2. 使用Prometheus ,Grafana等监控工具,监控api接口在测试环境的QPS

批量操作

目的:加快处理逻辑,一定程度上可以降低api超时时间

实现案例:

  1. 后端接口逻辑中,同类型数据执行批量保存,减少jdbc时间
  2. 上传接口要支持多图上传
  3. 删除接口要支持按ids删除1个或多个
  4. 大数据场景下,导入接口要支持单文件或多文件数据批量导入,后台分批次多线程处理写入
  5. 大数据场景下,导出接口可以分批次多线程查询数据,然后合并结果并导出excel文件

异步处理

目的:同步转异步,当前端一个接口要触发后端多个长逻辑时,经过仔细分析考量后,确认哪些逻辑可以转异步执行的,然后进行异步处理,提升复杂业务逻辑的接口性能。

实现方法:

  1. 利用MQ组件,一些实时性要求低的操作,把操作数据发送到MQ,然后让MQ消费者订阅后再执行操作处理。这样API接口发送MQ消息后立即返回成功,消息会由MQ消费者异步处理完成。
  2. 利用juc并发工具来对后端逻辑中的多个操作进行异步编排,如下
    CountDownLatch----允许一个或多个线程等待其他线程完成操作,它可以用来实现线程之间的等待和协调;
    CyclicBarrier----用于实现多个线程之间的屏障,它可以让一组线程等待,直到所有线程都到达指定的屏障点;
    CompletableFuture----jdk8提供的强大的异步编排工具,可以组合多个异步任务,实现串行执行,合并结果,异常处理等操作。

单一职责

目的:一个API接口尽量只做一个单一的业务操作。(实际开发中可能因为赶时间、降低前端难度等原因,经常要后端一个接口做多个复杂业务,这实际是项目技术债务)

设计思路:

  1. 尽量开发前,产品需求前后端人员有充足的会议讨论,共同设计一个 简单易用同时方便前后端开发的产品。
  2. 比如,原型设计中多使用 步骤条,穿梭框 等UI组件,把复杂业务流程简单化,而不是一味推给后端搞。建议原型设计多参考 AntDesignUI 和elementUI 提供的各种UI组件,大厂不是平白无故开发这些组件的,那都是为了实现各种需求,搞的设计思路。
  3. 不要搞方便了自己,麻烦了别人的做法。有些时候,UI的具体实现是 应该前端做es6的查询过滤排序等操作;有的时候,UI的实现中应该后端直接提供过滤、排序后的数据;还有就是 不要让前端同学生成id数据,虽然我知道前端领域有vue-uuid这种组件,但是我认为id数据应该后端产生,前端查询和使用。
  4. 要根据UI原型和业务需求,综合考量前后端的工作细节项。避免出现 方便了前端,麻烦了后端;或方便了后端,麻烦了前端。

数据脱敏

目的:数据部分加密后展示给前端,用来保护姓名、手机号等隐私数据,防止泄露隐私
实现方法:

  1. 用星号替代部分内容,如手机号132*****153
  2. 用预设的文本做内容替代,如 王先生/女士

完善的接口文档或API用例

目的:减少沟通成本,便于前后端对接API

具体方法:

  1. 法一—使用swagger 或knife4j 实现在线API接口文档,随服务启动而启动,让前端同学自己去看去对接;不过swagger 或knife4j 都对后端代码有侵入性,如果项目没有太高性能要求,可以使用这种方式。

  2. 法2----后端使用postman自测接口后,导出postman的apijson文件给前端,让前端把apijson文件导入自己的postman中,然后前端根据postman测试用例,自己开发前端axios请求逻辑;但前提是后端在使用postman自测接口时,完善的标记好字段含义,字段示例值等描述信息

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多设备互通、开箱即用的私有化笔记软件,极空间部署最强备忘录项目『Memos』

多设备互通、开箱即用的私有化笔记软件,极空间部署最强备忘录项目『Memos』 哈喽小伙伴们好,我是Stark-C~ 手机上的备忘录我想绝大多数的小伙伴都会用到,日常用来记录一下生活中的消费开支清单,或者工作中记录一些重要的任务或项…

【动态规划】0-1背包问题

【动态规划】0-1背包问题 题目:现在有四个物品,背包总容量为8,背包最多能装入价值为多少的物品? 我的图解 表格a【i】【j】表示的是容量为j的背包装入前i个物品的最大价值。 拿a【1】【1】来说,它的值就是背包容量为1,只考虑…

4.1 初探Spring Boot

初探Spring Boot实战概述 Spring Boot简介 Spring Boot是一个开源的Java框架,由Pivotal团队(现为VMware的一部分)开发,旨在简化Spring应用程序的创建和部署过程。它通过提供一系列自动化配置、独立运行的特性和微服务支持&#…

低代码开发MES系统,一周实现数字化

随着工业4.0和智能制造的兴起,企业对于生产过程的数字化、智能化需求日益迫切。制造执行系统(MES)作为连接计划层与控制层的关键信息系统,在提升生产效率、优化资源配置、保障产品质量等方面发挥着重要作用。然而,传统…

数据质量管理解决方案(55页PPT)

方案介绍: 数据质量管理解决方案是一个系统性的方法,旨在确保数据的准确性、完整性、一致性、可靠性和可用性。该解决方案覆盖了数据从产生到消亡的整个生命周期,包括数据的计划、获取、存储、共享、维护、应用和消亡等各个阶段。数据质量管…

IDEA导入项目报错java程序包不存在

如图文件结构,本来是在web-demo中操作,但是想导入一下其他模块,切换了项目文件的目录,发现需要重新对Tomcat等进行配置,配置好之后发现运行出现Java相关错误(如下)记录一下修正过程。 java: 程序…

【教程】Linux设置进程的优先级

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 关键指令 sudo chrt -f <优先级> <指令> 示例脚本 当然也可以不是启动Python脚本&#xff0c;普通的指令都可以&#xff0c;可自行适当修…

2024/6/16 英语每日一段

Nature has the means--to a degree--to limit the effects of climate change. Intact ecosystems such as forests, grasslands, oceans and peatlands are “carbon sinks”--natural storage systems that remove atmospheric carbon and other greenhouse gases--and are …

Intel HDSLB 高性能四层负载均衡器 — 代码剖析和高级特性

目录 文章目录 目录前言代码剖析软件架构目录结构配置解析启动流程分析数据面 jobs 注册数据面 jobs 执行 转发流程分析收包阶段L2 处理阶段L3 处理阶段L4 处理阶段 高级特性大象流转发优化快慢路径分离转发优化报文基础转发优化 最后参考文档 前言 在前 2 篇文章中&#xff0…

【云原生】Kubernetes----Kubernetes集群部署Prometheus 和Grafana

目录 引言 一、环境准备 二、部署node-exporter &#xff08;一&#xff09;创建命名空间 &#xff08;二&#xff09;部署node-exporter 1.获取镜像 2.定义yaml文件 3.创建服务 4.查看监控数据 三、部署Prometheus &#xff08;一&#xff09;创建账号并授权 &…

Java学习笔记之基本数据类型转换

前言 本篇文章是基于我本人在初学JAVA阶段想记录的的学习笔记&#xff0c;如有错误&#xff0c;恳请指正。今天要干掉的是JAVA的基本数据类型转换 Java的基本数据类型转换 前言一&#xff0c;基本数据类型复习二&#xff0c;基本介绍什么是自动类型转换&#xff1f; 三&#…

【Numpy】一文向您详细介绍 np.round()

【Numpy】一文向您详细介绍 np.round() 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&#xff0c;…

从0到1搭建MCU芯片上操作系统环境。开发都需要哪些环节和准备

MCU芯片环境搭建与操作系统上载步骤 1. 硬件准备 选择合适的MCU芯片&#xff0c;例如STM32、GD32等。 准备开发板&#xff0c;用于硬件连接和实验。 准备必要的外围设备&#xff0c;如电源适配器、USB转串口模块等。 2. 软件环境搭建 安装编程语言环境&#xff0c;如C/C编译…

NVIDIA Triton系列02-功能与架构简介

NVIDIA Triton系列02-功能与架构简介 B站&#xff1a;肆十二-的个人空间-肆十二-个人主页-哔哩哔哩视频 (bilibili.com) 博客&#xff1a;肆十二-CSDN博客 问答&#xff1a;(10 封私信 / 72 条消息) 肆十二 - 知乎 (zhihu.com) 前面文章介绍微软 Teams 会议系统、微信软件与腾讯…

微信视频号视频怎么下载才能保存视频到手机相册,推荐一款稳定的视频号下载工具

视频号视频下载发现写了很多次&#xff0c;竟然还有很多人不知道微信视频号视频怎么下载&#xff0c;今天就来说说这款视频号下载工具。 视频号下载工具介绍 这款视频号下载工具叫视频号下载plus&#xff0c;也有很多人称之为视频下载小助手不知道的可以自行百度。 注意在百度…

码住!详解时序数据库不同分类与性能对比

加速发展中的时序数据库&#xff0c;基于不同架构&#xff0c;最流行的类别是&#xff1f; 作为管理工业场景时序数据的新兴数据库品类&#xff0c;时序数据库凭借着对海量时序数据的高效存储、高可扩展性、时序分析计算等特性&#xff0c;一跃成为物联网时代工业领域颇受欢迎的…

SolarLab - hackthebox

简介 靶机名称&#xff1a;SolarLab 难度&#xff1a;中等 靶场地址&#xff1a;https://app.hackthebox.com/machines/SolarLab 本地环境 靶机IP &#xff1a;10.10.11.16 ubuntu渗透机IP(ubuntu 22.04)&#xff1a;10.10.16.17 windows渗透机IP&#xff08;windows11&…

RawChat:优化AI对话体验,全面兼容GPT功能平台

文章目录 一、Rawchat简介1.1 RawChat的主要特性1.2 RawChat的技术原理简述 二、使用教程三、案例应用3.1 图片内容分析3.2 生图演示3.3 文档解析3.4 探索更多 四、小结 一、Rawchat简介 RawChat平台的诞生&#xff0c;其核心理念是降低用户访问类似ChatGPT这类先进AI服务的门…

FPGA - 数 - 加减乘除

一&#xff0c;数的表示 首先&#xff0c;将二进制做如下解释&#xff1a; 2的0次方1 2的1次方2 2的2次方4 2的3次方8 ..... 以此类推&#xff0c;那么任何整数&#xff0c;或者说任意一个自然数均可以采用这种方式来表示。 例如&#xff0c;序列10101001&#xff0c;根据上述…

ThinkPHP邮件发送配置教程?怎么配置群发?

ThinkPHP邮件发送安全性如何保障&#xff1f;ThinkPHP如何实现&#xff1f; 无论是用户注册后的验证邮件&#xff0c;还是订单处理的通知邮件&#xff0c;都需要一个可靠的邮件发送机制。AokSend将详细介绍如何在ThinkPHP框架中配置邮件发送功能&#xff0c;并带您逐步了解其中…