3条原则,16个小点,帮你写出一个优秀的对外接口!

简介: 3条原则,16个小点,帮你写出一个优秀的对外接口!
  • 安全性
  • 幂等性
  • 数据规范
  • 版本控制
  • 响应状态码规范
  • 统一响应数据格式

对外API接口设计

安全性

1、创建appid,appkey和appsecret

  • appid:应用的唯一标识
  • appkey:公钥=账号
  • appsecret:私钥=密码

1、设计一个认证系统,专用于创建第三方接入应用的账号信息,用于生成appid,appkey和appsecret,然后发appkey和appsecret给第三方接入应用,用于做认证

ps:appkey和appsecret成对出现的机制,目的在于首次验证(类似登录场景),用来申请一个token,之后请求数据请求,就直接带token请求服务端认证即可。

2、第三方接入应用自行注册,需要校验企业信息合法性(暂不考虑)

1.png

2、Token:令牌(过期失效)

1、第三方接入应用获取第一步中的appkey和appsecret

2、请求认证系统获取nonce随机数,服务端在缓存中存放下nonce

3、客户端拿到这个随机数后将其与appsecret拼接生appsecretStr,然后调用生成签名方法,传入appsecretStr,appkey,nonce,url(备注:可转大写,转小写,追加特殊字符,然后加密)进行非可逆加密(MD5/SHA1等),生成签名A。接着构造请求把签名放到请求头signature,post请求体中放入参数:appkey,nonce,timestamp,url根据request.getRequestURI()获取,调用认证接口

4、认证系统获取请求后,查询根据appkey查询缓存中的nonce,判断是否存在,不存在则提示不合法请求;判断是否相等,不等则为恶意请求。

判断timestamp的时效性,防止恶意请求:数据包中的客户端时间戳字段,然后用服务器当前时间去减客户端时间,看结果是否在一个区间内。

先根据appkey查询数据库,判断是否存在,如不存在则提示不合法用户;反之,查出appsecret,按照客户端的签名加密方式,进行加密,生成签名B,比较A和B,如果一样则生成token,失效缓存中的nonce,返回token。

3、Post请求

4、客户端IP白名单 (可选)

5、单个接口针对IP限流(令牌桶限流,漏桶限流,计数器限流)

限流是为了更好的维护系统稳定性。使用redis进行接口调用次数统计,ip+接口地址作为key,访问次数作为value,每次请求value+1,设置过期时长来限制接口的调用频率

6、记录接口请求日志

使用aop全局记录请求日志,快速定位异常请求位置,排查问题原因。

7、采用Https

1、服务端配置SSL证书

2、客户端调用https工具类忽略服务端证书校验

8、数据合法性校验

9、密码查询(加缓存,key使用客户号)

1、密码更新时,更新redis;

2、缓存查不到,查数据库,同时更新缓存;

3、密码在缓存和数据库都需要加密,返回时才解密(或者是返回客户端时,客户端自行解密)

10、接口调用失败告警

11、高可用:服务器集群部署(2-3)

客户端重试机制

12、变更轨迹,保存上次密码?

13、查询密码和交易密码是否分两条?

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。

项目地址:https://github.com/YunaiV/ruoyi-vue-pro

幂等性

幂等性是指任意多次请求的执行结果和一次请求的执行结果所产生的影响相同。说的直白一点就是查询操作无论查询多少次都不会影响数据本身,因此查询操作本身就是幂等的。但是新增操作,每执行一次数据库就会发生变化,所以它是非幂等的。

幂等问题的解决有很多思路,这里讲一种比较严谨的。提供一个生成随机数的接口,随机数全局唯一。调用接口的时候带入随机数。

第一次调用,业务处理成功后,将随机数作为key,操作结果作为value,存入redis,同时设置过期时长。

第二次调用,查询redis,如果key存在,则证明是重复提交,直接返回错误。

基于微服务的思想,构建在 B2C 电商场景下的项目实战。核心技术栈,是 Spring Boot + Dubbo 。未来,会重构成 Spring Cloud Alibaba 。

项目地址:https://github.com/YunaiV/onemall

数据规范

版本控制

一套成熟的API文档,一旦发布是不允许随意修改接口的。这时候如果想新增或者修改接口,就需要加入版本控制,版本号可以是整数类型,也可以是浮点数类型。一般接口地址都会带上版本号,http://ip:port//v1/list

响应状态码规范

2.png

3.png

统一响应数据格式

为了方便给客户端响应,响应数据会包含三个属性,状态码(code)、信息描述(message)、响应数据(data)。客户端根据状态码及信息描述可快速知道接口,如果状态码返回成功,再开始处理数据。

响应结果定义及常用方法:

4.png5.png

相关文章
|
3月前
|
存储 监控 NoSQL
阿里云服务器ESSD云盘怎么样?ESSD云盘规格、计费与应用场景解析参考
阿里云ESSD云盘融合25GE网络与RDMA技术,为单个云盘提供高达100万随机读写性能,实现低时延,是阿里云在存储技术领域的重要成果。ESSD云盘规格多样,性能级别分PL0至PL3四档,满足不同业务需求,且性能随容量增加而提升。计费方式灵活,包括按量付费、包年包月及存储容量单位包。不同容量范围和性能级别,以及实例规格的存储I/O性能的差异可适应不同的应用场景,为用户提供稳定高效的存储支持。
|
6月前
|
人工智能 移动开发 自然语言处理
阿里云智能建站系统「万小智」,对话式AI网站搭建,多端建站
万小智AI建站是阿里云推出的AI数字员工,面向中小微企业和个人创业者,集成网站搭建、视觉设计、智能客服与内容创作于一体。基于通义大模型,支持对话式建站、AI生成配图与SEO优化文案,5分钟建站、10分钟上线,无需代码。提供基础版(450元/年起)、标准版(980元/年起)、企业版(1980元/年起),预置千套模板,多端适配,一键部署,助力用户低成本打造专业官网并实现智能运营。
|
12月前
|
人工智能 IDE 开发工具
寻找Cursor的替代品:10款AI编程工具深度评测与推荐·优雅草卓伊凡
寻找Cursor的替代品:10款AI编程工具深度评测与推荐·优雅草卓伊凡
9764 18
寻找Cursor的替代品:10款AI编程工具深度评测与推荐·优雅草卓伊凡
|
存储 编译器 程序员
【C语言】auto 关键字详解
`auto` 关键字用于声明局部变量的自动存储类,其作用主要体现在变量的生命周期上。尽管现代C语言中 `auto` 的使用较少,理解其历史背景和作用对于掌握C语言的存储类及变量管理仍然很重要。局部变量默认即为 `auto` 类型,因此在实际编程中,通常不需要显式声明 `auto`。了解 `auto` 关键字有助于更好地理解C语言的存储类及其在不同场景中的应用。
841 1
|
人工智能 Java 程序员
通义灵码深度评测:AI程序员是效率革命,还是昙花一现?
在AI编程浪潮中,阿里云推出的通义灵码以“全栈AI程序员”定位强势入局。通过两周深度体验,这款基于通义大模型的工具展现了从代码补全到工程架构、跨语言开发、单元测试及错误排查的强大功能。它不仅大幅提升了开发效率,如节省60%以上的脚手架搭建时间,还在多文件协同和架构感知方面表现出色。尽管在复杂业务逻辑和框架特性理解上仍有提升空间,通义灵码已展现出颠覆性价值,使开发者能聚焦核心业务创新。
|
存储 安全 API
每日一博 - App key和App Secret
每日一博 - App key和App Secret
3918 1
|
人工智能 自动驾驶 安全
“第四次工业革命”-AI革命
“AI变革”被誉为“第四次工业革命”。中国在AI领域持续发力,占亚太地区AI支出的五成,预计2023年市场规模将达到147.5亿美元,约占全球市场的十分之一。IDC预测,中国生成式AI市场年复合增长率将达86.2%。国内企业如百度、阿里、清华等在AI技术研发和应用方面取得显著进展,推动了无人驾驶、送餐机器人、无人快递车等应用场景的发展。尽管AI带来了降本增效,但也引发了就业和社会压力。总体而言,中国在AI领域的投入和发展势头强劲,未来前景广阔。
1186 0
“第四次工业革命”-AI革命