无规矩不成方圆,聊一聊 Spring Boot 中 RESTful 接口设计规范

本文主要是介绍无规矩不成方圆,聊一聊 Spring Boot 中 RESTful 接口设计规范,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 
  • 原创 | Java 2021 超神之路,很肝~

  • 中文详细注释的开源项目

  • RPC 框架 Dubbo 源码解析

  • 网络应用框架 Netty 源码解析

  • 消息中间件 RocketMQ 源码解析

  • 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析

  • 作业调度中间件 Elastic-Job 源码解析

  • 分布式事务中间件 TCC-Transaction 源码解析

  • Eureka 和 Hystrix 源码解析

  • Java 并发源码

来源:www.cnblogs.com/wangjiming

  • 一 规范性建议

    • 1.职责原则

    • 2.单一性原则

    • 3.协议规范

    • 4.路径规则

    • 5.http请求方式

    • 6.域名

    • 7.跨域考虑

    • 8.api版本

    • 9.适度过滤信息

    • 10.返回数据格式

    • 11.安全性原则

    • 12.可扩展性原则

    • 13.定义api界限

    • 14.定义api返回码

  • 二 反规范性建议

    • 1.Request

    • 2.Responce

  • 三 实例

    • (一)定义统一参数

    • (二)定义接口授权类别

    • (三)用户接口

    • (四)用户登录

da39bb0cbfcf65bfda8332825e0efc77.png


在设计接口时,有很多因素要考虑,如接口的业务定位,接口的安全性,接口的可扩展性、接口的稳定性、接口的跨域性、接口的协议规则、接口的路径规则、接口单一原则、接口过滤和接口组合等诸多因素,本篇文章将简要分析这些因素。

一 规范性建议

1.职责原则

在设计接口时,必须明确接口的职责,即接口类型,接口应解决什么业务问题等

2.单一性原则

在明确接口职责的条件下,尽量做到接口单一,即一个接口只做一件事,而非两件以上。很多非资深接口设计者,在设计接口时,总认为接口所做的事越多,越牛叉,这是非常严重的错误认识。

3.协议规范

在设计接口时,应明确接口协议,是采用HTTP协议,HTTPS协议还是FTP协议,要根据具体情况来定。

  • FTP协议(File Transfer Protocol,简称FTP),是一套标准的文件传输协议,用于传输文件,如.txt,.csv等,一般文件传输,采用FTP协议

  • HTTP协议,适用一般对安全性要求比较低或没要求的业务情景

  • HTTPS=HTTP+SSL,适用于对安全性要求较高的业务情景

4.路径规则

由于api获取的是一种资源,所以网址中尽量为名词,而非动词

/api/v1.0/pruduct/2019 /api/v1.0/users/2019

5.http请求方式

接口基本访问协议:get(获取),post(新增),put(修改)和delete(删除)

  • get /users:列出所有用户

  • get /users/id:根据id获取用户

  • post /user:新增用户

  • put /user/id:根据用户id更新用户

  • delete /user/id:根据用户id删除用户

6.域名

一般地,域名分为主域名和专有域名,主域名适合api长期不变或变化较少的业务,专有域名是解决具体的专有业务的

以百度举例:

(1)主域名:www.baidu.com

(2)产品服务类

  • 百度文库:https://wenku.baidu.com/

  • 百度知道:https://zhidao.baidu.com/

  • 百度资讯:https://zhidao.baidu.com/

(3)市场活动类

  • 百度公益:http://gongyi.baidu.com

  • 百度logo:http://logo.baidu.com/

  • 百度世界:https://baiduworld.baidu.com

7.跨域考虑

在明确域名的情况下,一定要考虑接口是否跨域,以及跨域应采用的技术手段等。

8.api版本

对于接口的url,应加版本号http://api.demo.com/v{d}/,如 ,其中d表示版本号,如v1.0,v2.0

例子:获取产品号为2019,版本号为v1.0的版本号的产品信息

/api/v1.0/Pruducts/2019

9.适度过滤信息

当记录数比较多时(如 SELECT * FROM TBName),因适当添加一些条件对数据进行过滤,如TOP,分页,分组,排序和WHERE条件等

下面是一些常见的参数。
  • ?limit=100:返回100条数据

  • ?offset=101:从第101条数据开始返回

  • ?page=10:指第10页

  • per_page=100:每页100条数据

  • ?sortby=name:排序字段

  • ?order=desc:降序

  • ?group=groupName:分组

  • ?producy_type=1:筛选条件

10.返回数据格式

返回数据格式,一般包括三个字段:

(1)失败情况(状态码、错误码和错误描述)

{“status”:0,//状态码 0-表示失败,1-表示成功“error_code”:”2003”,//错误码,一般在设计时定义“error_des”:”身份验证失败”//错误描述,一般在设计时定义}

(2)成功情况(标识id,数据对象,状态码)

{”sid“:”sh20190111”,//token id”users“:{”id“:”al201901111341”,//用户id“name”:”Alan_beijing”,//用户名“addr”:”用户地址”},“status”:1//状态码 0-表示失败,1-表示成功}

11.安全性原则

接口暴露的考虑,接口并发量的考虑,接口防攻击的考虑,接口跨域的考虑等

12.可扩展性原则

在设计接口时,充分考虑接口的可扩展性。

13.定义api界限

任何api,从权限上,可归结为匿名api和非匿名api,前者不需要验证,后者需要验证

14.定义api返回码

在api设计时,要定好api返回码,如

  • 1 --授权过期

  • 404--未找到资源

  • 500--内部服务器错误

  • 600--账号被锁

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

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

二 反规范性建议

存在这样一种业务场景:某个接口需要返回多个api接口组合的结果 ,在类似的业务场景下,所设计的接口,具有一定的反规范性。

1.Request

data:[{url:'api1',type:'get',data:{...}},{url:'api2',type:'get',data:{...}},
]

2.Responce

{status:0,msg:'',data:[{status:1,msg:'',data:[]},{status:1,msg:'',data:{}}]
}

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

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

三 实例

假设存在这样一个一个业务:一个ERP系统,需要提供两个接口,一个是用户访问接口(需要验证),另一个是用户注册接口(不需要验证)。

根据本篇文章一,二部分的建议,我们来设计满足该业务需求的接口

(一)定义统一参数

1.定义统一输入参数
0d11e79f9bd7a0c0e284d992ce319247.png
2.定义统一输出参数
6ef85e50fd35e45ac75c8e34e99253e7.png
3.定义统一错误码
349eac65787b4433489183b04c976e11.png

(二)定义接口授权类别

如下为定义接口授权类别

80042321d5ea8715ff46a95e0438f35c.png

(三)用户接口

1.用户注册
080001e2398070c8b021a242225d957c.png
2.Request
0ea3d9e612d06e88299bb2f53e135ed4.png
3.Responce
bd6f6196f7d4317902f06420e89bb0f2.png
4.code示例
Request:
{"mobile":13636595499,"verify_code":"987654","pwd":"123456"
}Responce:
(1)error
{"status":0,"error_code":1001,"error_desc":"手机验证码已失效"
}
(2)succed
{"sid":"sh201901141529","uid":1,"status":1
}

(四)用户登录

1.登录接口概述
63839405b4257c574b7b455628438fae.png
2.Request
64250fe154dd6fbb30c44c8913755ca1.png
3.Responce
91dff8c6a233a5dd2db1a9a7aa1fb356.png
4.Code
Responce:
1.error
{"status":0,"error_code":1002,"error_desc":"密码错误"
}
2.succeed
{"sid":"sh201901141529","user":{"id":1,"username":"",age:0,gender:0},"status":1
}


欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

d293aedc124613aff761267c955dba1f.png

已在知识星球更新源码解析如下:

98847eb56c3958ea0f151206990b02bf.png

1cbd1251eb134558e1cb7e4937fdd7c1.png

92907f7f125a6068d3bda8080f8baf19.png

f569c63767335ffb5e0ed80f96384d63.png

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)

这篇关于无规矩不成方圆,聊一聊 Spring Boot 中 RESTful 接口设计规范的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/333631

相关文章

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位