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

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2