API开发与管理规范v1.0
1. 协议规范
为了确保不同业务系统之间以及前后端的的数据交互的快捷性,通讯协议统一约定如下:
- 对内调用的API接口统一使用 HTTP协议
- 对外互联网发布的API建议使用HTTPS协议也可以使用HTTP
- 新的API接口必须使用标准的HTTP报文并使用JSON作为统一的数据传送标准
- 如无特殊情况禁止在新开发的API接口中使用XML格式传送数据,统一使用JSON格式作为数据包或者form键值对模式数据包。
- 请求输入输出数据要求诮遵循JSON 格式规范,优先采用小驼峰式的字段命名规范。
2. Method规范
- 在接口路径规范阅读之前必须先定义好Method规范,虽然Restful风格建议使用get、post、delete、put来区分和操作不同的资源,但是在实际项目开发的过程中全部使用Restful风格往往会造成开发效率的降低,而且在资源较多时API命名将给开发人员造成很大的困扰。
- 我们建议在Http Method标准上只允许使用get和post方法,禁止使用delete和put方法,很多企业和安全扫描工具不允许开放delete和put方法,有些web防火墙默认会拦载delete和put方法的请求。
- 使用了delete和put方法后tomcat安装后还需要进行配置才能支持此两种方法,delete和put方法在键值对提交模式下后端servlet接收参数必须要自已从流中接收开发难度增大。
- 前端使用delete和put方法时没有get和post快捷。
- 我们建议在API开发时只允许使用get和post方法,delete和update则放在url中。
- 更新用户使用:POST /appid/users/update
- 删除用户使用:POST /appid/users/delete
3. 安全性和幂等性
- 安全性:不会改变资源状态,可以理解为只读的,输入相同参数的情况下总是能查出相同的内容
- 幂等性:执行1次和执行N次,对资源状态改变的效果是等价的,适于用参与事务的API必须要具有幂等性的API
| . | 安全性 | 幂等性 |
|---|---|---|
| GET | 底 | √ |
| POST | 高 | 参与事务时必须支持 |
POST提交的API如果参与到API服务编排平台中时如果要支持补偿或事务时则必须支持幂等性,否则API服务编排平台在进行事务补偿执行时有可能会发生多次重复数据写入的可能。
4. 接口路径规范
API接口路径规范的原则是能从路径中清析的查看到此API所属的业务领域或应用,appid必须先在RestCloud平台中建立。
- 路径中必须包含所属的appid应用编号示例:/appid/api/delete
- 路径中的变量参数应尽量放在最后示例:
/appid/users/{id} 正确
错误: /appid/{id}/users
在RestCloud平台中路径变量越靠后性能越好,越靠前则所能匹配到的url会越多,系统需要一层一层分析比对才能最终确定所调用的API,在如果路径中没有{}变量的情况下,url的长短并不影响性能,但是过长的url不便于阅读。
- 如果路径中包含API的版本号,版本号应位于/appid/后面
正确示例:/appid/v1/api/update
错误示例:/v1/appid/api/query
- 路径中的所有字母建议使用小写,词语之间的分隔可以使用/路径或者_下划线,而不要在URL中使用驼峰格式,因为URL是区分大小写的,所以全部小写是比较好的策略。
正确示例:/appid/v1/user/username_info
错误示例:/appid/v1/user/usernameInfo
- 定义自定义路径部分时,使用名词的复数形式定义一个资源,如若有动词词性在url中考虑以下划线区分,在使用动词为前/后缀时,常见动词有:add、delete、update、query、get、send、save、detail、list等.
- 基本操作示例
GET /users 获取用户列表
GET /users/{userId} 查看某个具体的用户信息
POST /users/update 新建或更新一个用户
POST /users/delete 删除某一个用户信息
GET /users/search 搜索用户
- 避免层级过深的URI
/在url中表达层级,用于按实体关联关系进行对象导航,一般根据id导航。过深的导航容易导致url膨胀,不易维护,如 GET /zoos/1/areas/3/animals/4,可以尽量使用查询参数代替路径中的实体导航,如GET /animals?zoo=1&area=3;
- 对资源访问时的URL约定
服务器端的资源组合实体建议在uri中通过父实体的id导航访问,组合实体不是主实体,它的生命周期完全依赖父实体,无法独立存在,在实现上通常是对数据库表中某些列的抽象,不直接对应表,也无id。一个常见的例子是 User — Address,Address是对User表中zipCode/country/city三个字段的简单抽象,无法独立于User存在,则获取address的api的url为:
GET /user/addresses
5. 请求参数规范
请求参数字段,尽可能与数据库表字段、对象属性名等保持一致,因为保持一致最省事,最简单,对于敏感数据或安全性较高的API则可以与数据库字段或对像不一致。
分页参数约定:
当前页统一使用:pageNo参数
每页显示数统一使用:pageSize参数
搜索关键字统一使用:keywords参数
排序:?sort=age,desc
传入参数共分为 3 种类型
- 地址栏参数
restful 地址栏参数 /api/v1/product/00123 00123为产品编号,获取产品为 00123 的信息,其他示示例用法:
get 方式的查询字串,此种方式主要用于过滤查询,如下:
?limit=10:指定返回记录的最大数量
?pageNo=2&pageSize =100:指定第几页,以及每页的记录数。
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
?producy_type=1:指定筛选条件
- 请求 body 数据
主要用于提交新建数据等,get请求应使用url参数,而非json 格式,post请求数据为RequestBody时请使用标准的JSON数据作为请求格式如下:
{
“userName”:”admin”, //认证token
“age”:”123”
}
- 请求头
用于存放请求格式信息、版本号、token 密钥、语言等信息。请求头根据项目需求添加配置参数。如:请求数据格式,accept=‘application/json’等。如有需要,请求头可根据项目需求要求传入用户token、唯一验签码等加密数据。
- 请求示例
对于Body请求的参数API接口必须提供JSON请求示例和返回示例,否则API的调用者很难知道Body参数的格式。
6. 返回数据规范
统一规范返回数据为json格式,返回数据应包含:返回状态码、返回状态信息、具体数据等。
格式规范如下:
{
"state":true, //表示成功,false表示失败
"msg":"success",
“ercode”:500 //如果有错误时返回错误状态码
"data": {
//json格式的具体数据
}
}
分页格式规范如下:
{
"state":true, //表示成功,false表示失败
"msg":"success",
“ercode”:500 //如果有错误时返回错误状态码
page:{//分布对象格式
"pageNo":1, //当前页码
"totalPages":1, //总页码
"pageSize":20, //分页大小
"total":2, //总记录数
}
"data": {
//json格式的具体数据
}
}
API执行过程中禁止发生了错误但给2xx响应,客户端可能会缓存成功的http请求;
正确设置http状态码,不要自定义;
Response body 提供
错误的代码(可协助用于进行日志/问题追查的编码);
错误的描述文本(展示给用户的提示信息);
API 可能抛出两类异常:业务异常和非业务异常。业务异常由自己的业务代码抛出,表示一个用例的前置条件不满足、业务规则冲突等,比如参数校验不通过、权限校验失败。非业务类异常表示不在预期内的问题,通常由类库、框架抛出,或由于自己的代码逻辑错误导致,比如数据库连接失败、空指针异常、除0错误等等,业务类异常统一设置 HTTP 响应状态码为:500;
7. 数据大小约定
单个API的请求及响应数据严格上不建议超过10M,超过10M的数据会严重影响网络以及JSON的序列化性能,如果超过10M的数据建议使用分页传输。
8. API超时时间约定
API的响应时间一般不建议超过180S即3分钟,如果时间太久会影响API网关性能,同时也容易出现问题,如果超过3分钟以上的API链接时间可以使用MQ等方式进行数据传输。
API开发与管理规范v1.0的更多相关文章
- Linux系统部署规范v1.0
Linux系统部署规范v1.0 目的: 1.尽可能减少线上操作: 2.尽可能实现自动化部署: 3.尽可能减少安装服务和启动的服务: 4.尽可能使用安全协议提供服务: 5.尽可能让业务系统单一: 6.尽 ...
- Demo客户端相关规范 v1.0
目录 开发环境 开发工具 代码管理 项目代码 分支管理 名称管理 打包管理 存储路径 存储结构 测试包 正式包 名称管理 依赖组件 内部组件 外部组件 解决方案结构 解决方案命名 解决方案文件夹 项目 ...
- Flask框架学习笔记(API接口管理平台 V1.0)
今天博主终于完成了API接口管理平台,最后差的就是数据库的维护, 博主这里介绍下平台的设计原理,首先基于python,利用flask的web框架+bootstrap前端框架完成,先阶段完成了前台展示页 ...
- Python代码项目目录规范v1.0
程序目录规范:bin # 存放可执行程序 xxxx.py # 程序主程序(入口文件)config # 存放配置信息 settings.py # 全局配置文件(可能暂时未应用)db # 存放数据文件 c ...
- 第12章 X.509证书库的Fluent API - IdentityModel 中文文档(v1.0.0)
存储X.509证书的常见位置是Windows X.509证书存储区.商店的原始API有点神秘(在.NET Framework和.NET Core之间也略有变化). X509类是一个简化的API从所述存 ...
- CathyCMS-后台管理v1.0
摘要: 最近开发CathyCMS系统作为练手项目,后台管理部分v1.0暂时告一段落.目前只包含了基本的登录.权限管理.频道管理.文章管理功能. 项目地址: https://github.com/cat ...
- lib-qqwry v1.0 发布 nodejs解析纯真IP库(qqwry.dat)
lib-qqwry是当初学习node时用来练手的一个模块,用来解析纯真IP库的 现在发一个v1.0版本弥补我当时稚嫩的代码. 意外收获是,整理代码后发现,相比v0.x版本 急速模式下的效率提升大概20 ...
- J20航模遥控器开源项目系列教程(一)制作教程 | 基础版V1.0发布,从0到1
我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/C ...
- 基于swoole框架hyperf开发的纯API接口化的后台RBAC管理工具hyperfly@v1.0.0发布
hyperfly@v1.0.0发布 本文地址http://yangjianyong.cn/?p=323转载无需经过作者本人授权 github地址:https://github.com/vankour/ ...
- 安卓开发开发规范手册V1.0
安卓开发开发规范手册V1.0 之前发布过一份Web安全开发规范手册V1.0,看到收藏文章的读者挺多,发现整理这些文档还挺有意义. 最近周末抽了些时间把之前收集关于安卓安全开发的资料也整理了一下,整理出 ...
随机推荐
- 贝壳找房携手 Flutter,为三亿家庭提供更好的居住服务 | Flutter 开发者故事
贝壳找房是科技驱动的新居住服务平台,致力于在二手房.新房.租房以及装修等居住领域为三亿家庭提供全方位的品质居住服务.如此庞大的用户群体,自然也有着十分多样和复杂的使用场景和需求.以往使用原生开发模式时 ...
- socket close和shutdown的区别,TIME_WAIT和CLOSE_WAIT
TCP主动关闭连接 appl: close(), --> FIN FIN_WAIT_1 //主动关闭socket方,调用close关闭socket,发FIN < ...
- BOOST 环形队列circular_buffer
BOOST库的环形队列比较灵活,前插或后插,删除队首或删除队尾元素,都支持. 只贴代码: #include <boost/circular_buffer.hpp> #include < ...
- eBPF 概述:第 1 部分:介绍
1. 前言 有兴趣了解更多关于 eBPF 技术的底层细节?那么请继续移步,我们将深入研究 eBPF 的底层细节,从其虚拟机机制和工具,到在远程资源受限的嵌入式设备上运行跟踪. 注意:本系列博客文章将集 ...
- 直播预告 | 字节跳动云原生大数据分析引擎 ByConity 与 ClickHouse 有何差异?
ByContiy 是字节跳动开源的一款云原生的大数据分析引擎,擅长交互式查询和即席查询,具有支持多表关联复杂查询.集群扩容无感.离线批数据和实时数据流统一汇总等特点. ByConity 从1月份发布开 ...
- 数据库运维实操优质文章分享(含Oracle、MySQL等) | 2023年3月刊
本文为大家整理了墨天轮数据社区2023年3月发布的优质技术文章,主题涵盖Oracle.MySQL.PostgreSQL等数据库的基础安装配置操作.故障处理.性能优化等日常实践操作,以及概念梳理.常用脚 ...
- SIGIR2024| RAREMed: 不放弃任何一个患者——提高对罕见病患者的药物推荐准确性
SIGIR2024| RAREMed: 不放弃任何一个患者--提高对罕见病患者的药物推荐准确性 TLDR:在本文中,我们针对药物推荐模型对罕见病患者推荐精度低的问题,提出了一种新的基于预训练-微调的药 ...
- ARM 版 Kylin V10 部署 KubeSphere 3.4.0 不完全指南
前言 知识点 定级:入门级 KubeKey 安装部署 ARM 版 KubeSphere 和 Kubernetes ARM 版麒麟 V10 安装部署 KubeSphere 和 Kubernetes 常见 ...
- QT creator中cmake管理项目,如何引入外部库(引入Eigen库为例)
在Eigen的官网下载压缩包[点我进入] 解压到当前项目的根目录(当然你也可以自己选择目录) 在当前项目的CMakeLists.txt任意位置加入这句话include_directories(${CM ...
- Flink on Yarn和k8s
Yarn 架构 下图为作业提交到yarn的交互流程: 组件列表 ResourceManager (RM):ResourceManager (RM) 负责处理客户端请求.启动 / 监控 Applicat ...