API 接口设计规范
概述
这篇文章分享 API 接口设计规范,目的是提供给研发人员做参考。
规范是死的,人是活的,希望自己定的规范,不要被打脸。
路由命名规范
| 动作 | 前缀 | 备注 | 
|---|---|---|
| 获取 | get | get{XXX} | 
| 获取 | get | get{XXX}List | 
| 新增 | add | add{XXX} | 
| 修改 | update | update{XXX} | 
| 保存 | save | save{XXX} | 
| 删除 | delete | delete{XXX} | 
| 上传 | upload | upload{XXX} | 
| 发送 | send | send{XXX} | 
请求方式
| 请求方式 | 描述 | 
|---|---|
| GET | 获取数据 | 
| POST | 新增数据 | 
| PUT | 更新数据 | 
| DELETE | 删除数据 | 
请求参数
Query
url?后面的参数,存放请求接口的参数数据。
Header
请求头,存放公共参数、requestId、token、加密字段等。
Body
Body 体,存放请求接口的参数数据。
公共参数
APP 端请求
| 参数 | 说明 | 备注 | 
|---|---|---|
| network | 网络 | WIFI、4G | 
| operator | 运营商 | 中国联通/移动 | 
| platform | 平台 | iOS、Android | 
| system | 系统 | ios 13.3、android 9 | 
| device | 设备型号 | iPhone XR、小米9 | 
| udid | 设备唯一标示 | |
| apiVersion | API 版本号 | v1.1、v1.2 | 
WEB 端请求
| 参数 | 说明 | 备注 | 
|---|---|---|
| appKey | 授权Key | 字符串 | 
调用方需向服务方申请 appKey(请求时使用) 和 secretKey(加密时使用)。
安全规范
敏感参数加密处理
登录密码、支付密码,需加密后传输,建议使用非对称加密。
其他规范
- 参数命名规范 建议使用驼峰命名,首字母小写。
 - requestId 建议携带唯一标示追踪问题。
 
返回参数
| 参数 | 类型 | 说明 | 备注 | 
|---|---|---|---|
| code | Number | 结果码 | 成功=1 失败=-1 未登录=401 无权限=403  | 
| showMsg | String | 显示信息 | 系统繁忙,稍后重试 | 
| errorMsg | String | 错误信息 | 便于研发定位问题 | 
| data | Object | 数据 | JSON 格式 | 
若有分页数据返回的,格式如下:
{
    "code": 1,
    "showMsg": "success",
    "errorMsg": "",
    "data": {
        "list": [],
        "pagination": {
            "total": 100,
            "currentPage": 1,
            "prePageCount": 10
        }
    }
}
安全规范
敏感数据脱敏处理
用户手机号、用户邮箱、身份证号、支付账号、邮寄地址等要进行脱敏,部分数据加 * 号处理。
其他规范
- 属性名命名时,建议使用驼峰命名,首字母小写。
 - 属性值为空时,严格按类型返回默认值。
 - 金额类型/时间日期类型的属性值,如果仅用来显示,建议后端返回可以显示的字符串。
 - 业务逻辑的状态码和对应的文案,建议后端两者都返回。
 - 调用方不需要的属性,不要返回。
 
签名设计
签名验证没有确定的规范,自己制定就行,可以选择使用 对称加密、非对称加密、单向散列加密 等,分享下原来写的签名验证,供参考。
日志平台设计
日志平台有利于故障定位和日志统计分析。
日志平台的搭建可以使用的是 ELK 组件,使用 Logstash 进行收集日志文件,使用 Elasticsearch 引擎进行搜索分析,最终在 Kibana 平台展示出来。
幂等性设计
我们无法保证接口的每一次调用都是有返回结果的,要考虑到出现网络异常的情况。
举个例子,订单创建时,我们需要去减库存,这时接口发生了超时,调用方进行了重试,这时是否会多扣一次库存?
解决这类问题有 2 种方案:
一、服务方提供相应的查询接口,调用方在请求超时后进行查询,如果查到了,表示请求处理成功了,没查到就走失败流程。
二、调用方只管重试,服务方保证一次和多次的请求结果是一样的。
对于第二种方案,就需要服务方的接口支持幂等性。
大致设计思路是这样的:
- 调用接口前,先获取一个全局唯一的令牌(Token)
 - 调用接口时,将 Token 放到 Header 头中
 - 解析 Header 头,验证是否为有效 Token,无效直接返回失败
 - 完成业务逻辑后,将业务结果与 Token 进行关联存储,设置失效时间
 - 重试时不要重新获取 Token,用要上次的 Token
 
小结
限流设计、熔断设计、降级设计,这些就不多说了,因为大部分都用不到,当用上了基本上也都在网关中加这些功能。
暂时就想到这么多,规范这东西不是一成不变的,发现有不妥的及时调整吧。
你们接口的输入输出 Key,命名是用驼峰还是下划线?欢迎留言。
推荐阅读
API 接口设计规范的更多相关文章
- restFull api接口
		
RestFull api接口 前后端分离开发的接口规范 什么是RestFull 是目录比较流行的api设计规范 注:restfull api规范应用场景,前后端分离的项目中 数据接口的现场 例如: / ...
 - 如何设计一个牛逼的API接口
		
在日常开发中,总会接触到各种接口.前后端数据传输接口,第三方业务平台接口.一个平台的前后端数据传输接口一般都会在内网环境下通信,而且会使用安全框架,所以安全性可以得到很好的保护.这篇文章重点讨论一下提 ...
 - 干货来袭-整套完整安全的API接口解决方案
		
在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...
 - 12306官方火车票Api接口
		
2017,现在已进入春运期间,真的是一票难求,深有体会.各种购票抢票软件应运而生,也有购买加速包提高抢票几率,可以理解为变相的黄牛.对于技术人员,虽然写一个抢票软件还是比较难的,但是还是简单看看123 ...
 - 快递Api接口 & 微信公众号开发流程
		
之前的文章,已经分析过快递Api接口可能被使用的需求及场景:今天呢,简单给大家介绍一下微信公众号中怎么来使用快递Api接口,来完成我们的需求和业务场景. 开发语言:Nodejs,其中用到了Neo4j图 ...
 - web api接口同步和异步的问题
		
一般来说,如果一个api 接口带上Task和 async 一般就算得上是异步api接口了. 如果我想使用异步api接口,一般的动机是我在我的方法里面可能使用Task.Run 进行异步的去处理一个耗时的 ...
 - HTTP API接口安全设计
		
HTTP API接口安全设计 API接口调用方式 HTTP + 请求签名机制 HTTP + 参数签名机制 HTTPS + 访问令牌机制 有没有更好的方案? OAuth授权机制 OAuth2.0服务 ...
 - Postman - 功能强大的 API 接口请求调试和管理工具
		
Postman 是一款功能强大的的 Chrome 应用,可以便捷的调试接口.前端开发人员在开发或者调试 Web 程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的 Fi ...
 - H3 BPM引擎API接口
		
引擎API接口通过 Engine 对象进行访问,这个是唯一入口. 示例1:获取组织机构对象 this.Engine.Organization.GetUnit("组织ID"); 示例 ...
 
随机推荐
- BZOJ 2038: [2009国家集训队]小Z的袜子  (莫队)
			
题目传送门:小Z的袜子 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… ...
 - [转载] Windows系统批处理延迟方法
			
小贴士:方法四 亲测有效,因为当时对于精确度要求不是很高,所以没有具体测试它的精确度.其他方法没有测过,用到的时候再测吧! 批处理延时启动的几个方法 方法一:ping 缺点:时间精度为1秒,不够精确 ...
 - 搭建自己的Online Judge
			
前言 很多人对于做题有点厌烦,但是,如果让你出题给别人做那么可能会很有意思.可是,出题只能出在一些别人的OJ上,甚至只能在自己的Word文档里出.今天我教大家一个厉害点的,叫做搭建自己的Online ...
 - 【PCIE-4】---PCIE中部分概念或问题总结(很基础很重要)
			
前面三小节,介绍了PCIE的基本知识和概念,以及扫描流程.在不求甚解的情况下,我想各位小伙伴应该对PCIE有了个宏观的认识,OK,那么本章我们在之前的基础上,再单独把一些概念和更深层次的问题摘出来具体 ...
 - FreeRTOS低功耗模式
			
在系统或电源复位以后,微控制器处于运行状态.当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个外部事件时,用户需要根据最低电源消耗,最快速启动时间和可用的唤醒源等条件,选定一个最佳 ...
 - 初探ASP.NET Core 3.x (4) - 项目的重要组成
			
目录 O 前请提要 I 启动部分 I.1 Program类 I.2 Startup类 I.2.1 这个类干什么呢?? I.2.2 特征?? I.3 appsettings.json I.4 launc ...
 - Go Web 编程之 数据库
			
概述 数据库用来存储数据.只要不是玩具项目,每个项目都需要用到数据库.现在用的最多的还是 MySQL,PostgreSQL的使用也在快速增长中. 在 Web 开发中,数据库也是必须的.本文将介绍如何在 ...
 - (转)宽字节编码类型的XSS
			
今晚又看了一遍PKAV-心上的瘦子写的xss腾讯系列的例子,收获挺大的,其中对宽字节注入有了更深的了解,又查找了一些相关的资料,整理一下,以备以后查阅 参考文档: http://book.2cto.c ...
 - python3操作PyMySQL笔记
			
python3操作mysql需要先安装PyMySQL pip install PyMySQL 在linux登录mysql ,并且在安装数据库时设置了数据库的用户名“root”和密码“root”,mys ...
 - 华硕win10U盘重装系统进入pe
			
1.先要制作一个U盘的PE启动盘,建议使用WIN8 PE 2.将制作好的PE启动盘接上电脑,开机按F2键进入BIOS ,先将[Secure]菜单下[Secure Boot Control]选项设置为[ ...