无规矩不成方圆,聊一聊 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

相关文章

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

Java中Integer128陷阱

《Java中Integer128陷阱》本文主要介绍了Java中Integer与int的区别及装箱拆箱机制,重点指出-128至127范围内的Integer值会复用缓存对象,导致==比较结果为true,下... 目录一、Integer和int的联系1.1 Integer和int的区别1.2 Integer和in

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap