Spring Boot API 编写的十个最佳实践,你知道几个?

一个好的 API 不仅能提高开发效率,还能确保系统的安全性稳定性

第一部分:RESTful API 设计

  • 资源名称:使用名词表示资源,比如 /users

  • HTTP 方法:GET、POST、PUT、DELETE 分别对应查询、创建、更新和删除操作。

  • 状态码:返回有意义的 HTTP 状态码,如 200(成功)、404(未找到)、500(服务器错误)。

  • 图片

第二部分:Spring Boot 注解

Spring Boot 提供了一系列强大的注解,帮助我们简化代码。

  • @RestController:标识一个控制器类,它的所有方法都返回 JSON。

  • @RequestMapping:定义请求的 URL 路径。

  • @GetMapping:简化 GET 请求的映射。

第三部分:依赖注入

依赖注入(Dependency Injection)是 Spring 的核心概念之一,它让我们的代码更加松耦合。

图片

第四部分:异常处理

在 API 开发中,处理异常是必不可少的。

  • @ControllerAdvice:全局处理异常。

  • 自定义异常:定义业务相关的异常类型。

  • 图片

第五部分:数据传输对象 (DTO)

使用 DTO 可以使代码更清晰,也更易于维护。

这里依然推荐Lombok,网上虽然对它有一些争议,但我认为瑕不掩瑜。

图片

第六部分:安全性

API 的安全性至关重要。Spring Security 提供了强大的安全配置功能。

不管国产的开源项目有多优秀,我个人建议学习为主,不要轻易应用,Spring Security 依然是首选,这是多年工作经验带来的领悟。

图片

第七部分:版本控制

API 版本控制有助于管理不同的 API 版本,确保向后兼容。

这是一个很不错也很实用的技巧

 

java

@RestController
@RequestMapping("/api/v1/users")
public class UserControllerV1 {
// V1 版本的实现
}

@RestController
@RequestMapping("/api/v2/users")
public class UserControllerV2 {
// V2 版本的实现
}

第八部分:文档编写

API 文档是开发和维护过程中非常重要的一环。

Swagger 是一个流行的文档生成工具自不必说,国产的 knife4j 也是个不错的选择。

 

java

@EnableSwagger2
@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build();
}
}

第九部分:测试

测试是保证代码质量的关键。Spring Boot 的单元测试建议大家还是多用用。

一开始就写了单元测试,后期维护其实很方便,是一个长期利多的选择。

 

java

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserControllerTest {

@Autowired
private MockMvc mockMvc;

@Test
public void testGetUser() throws Exception {
mockMvc.perform(get("/users/1"))
.andExpect(status().isOk()) // 期望返回200状态码
.andExpect(jsonPath("$.name").value("John Doe")); // 期望返回的用户名称为 John Doe
}
}

第十部分:监控和日志记录

监控和日志记录有助于我们了解 API 的运行情况并及时发现问题。

Spring Boot Actuator 随着不断迭代其实已经比以前强了很多,大家可以学学。

当然,也有很多其他第三方接入工具,这个要根据你所在的公司来决定了,小公司没必要接入太多七七八八的东西,是自我内耗,有点规模的公司也不用你专门操心,一般都会有。

 

java

@EnableActuatorEndpoints
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

总结

这些最佳实践其实很简单,但很多人平时并不太注意。

最后说一句(求关注!别白嫖!)

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。

关注公众号:woniuxgg,在公众号中回复:笔记  就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/676106.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SaaS 电商设计 (十一) 那些高并发电商系统的限流方案设计

目录 一.什么是限流二.怎么做限流呢2.1 有哪些常见的系统限流算法2.1.1 固定窗口2.1.1 滑动窗口2.1.2 令牌桶2.1.3 漏桶算法 2.2 常见的限流方式2.2.1 单机限流&集群限流2.2.2 前置限流&后置限流 2.3 实际落地是怎么做的2.3.1 流量链路2.3.2 各链路限流2.3.2.1 网关层2…

【Java面试】七、SpringMvc的执行流程、SpringBoot自动装配原理

文章目录 1、SpringMVC的执行流程1.1 视图阶段1.2 前后端分离阶段 2、SpringBoot自动配置原理3、框架常用的注解3.1 Spring的注解3.2 SpringMvc的注解3.3 SpringBoot的注解 4、面试 1、SpringMVC的执行流程 1.1 视图阶段 旧项目中,未前后端分离时,用到…

计算机视觉与模式识别实验2-2 SIFT特征提取与匹配

文章目录 🧡🧡实验流程🧡🧡SIFT算法原理总结:实现SIFT特征检测和匹配通过RANSAC 实现图片拼接更换其他图片再次测试效果(依次进行SIFT特征提取、RANSAC 拼接) 🧡🧡全部代…

(CVPRW,2024)可学习的提示:遥感领域小样本语义分割

文章目录 相关资料摘要引言方法训练基础类别新类别推理 相关资料 论文:Learnable Prompt for Few-Shot Semantic Segmentation in Remote Sensing Domain 代码:https://github.com/SteveImmanuel/OEM-Few-Shot-Learnable-Prompt 摘要 小样本分割是一项…

JMeter性能测试实现与分析分享

JMeter是由著名开源软件巨头Apache组织开发的纯Java的压力测试工具,它即能测试动态服务(WebService),也能测试静态资源,包括Servlet服务、CGI脚本等,还能测试动态语言服务(PHP、Java、ASP.NET等…

外汇天眼:总是权衡利弊,投资注定失败

投资股票的人往往会频繁地评估自己的投资结果,尤其是在信息时代,手机上随时可以查看股票行情,导致很多人时不时地打开行情软件,看一看自己的股票是涨了还是跌了,盈利了还是亏损了。 频繁评估结果的弊端 一、引发急躁…

JVM学习-监控工具(二)

jmap:导出内存映像文件&内存使用情况 基本情况 jmap(JVM Memory Map):一方法获取dump文件(堆转储快照文件,二进制文件),还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用情况、堆中对象的统计信息、…

Golang TCP网络编程

文章目录 网络编程介绍TCP网络编程服务器监听客户端连接服务器服务端获取连接向连接中写入数据从连接中读取数据关闭连接/监听器 简易的TCP回声服务器效果展示服务端处理逻辑客户端处理逻辑 网络编程介绍 网络编程介绍 网络编程是指通过计算机网络实现程序间通信的一种编程技术…

成功解决“ModuleNotFoundError: No Module Named ‘utils’”错误的全面指南

成功解决“ModuleNotFoundError: No Module Named ‘utils’”错误的全面指南 在Python编程中,遇到ModuleNotFoundError: No Module Named utils这样的错误通常意味着Python解释器无法找到名为utils的模块。这可能是由于多种原因造成的,比如模块确实不存…

推荐一款开源Scada,数据采集必备

软件介绍 PySCADA的核心是一个基于HTML5的HMI,不仅确保现代性,还确保与各种设备的无缝集成。该框架通过提供对广泛工业协议的支持,进一步巩固其功能。这些包括Modbus TCP/IP、RTU、ASCII和Binary,让用户可以轻松地与不同的设备和系…

党历史纪念馆3d沉浸式虚拟展厅为参观者提供了一个身临其境的革命教育世界

传统的展览方式虽然能够传达一定的信息,但往往难以激发参观者的深度参与和共鸣。而廉政教育VR数字化展厅通过VR虚拟现实技术的运用,打破了传统展览的局限性,为参观者提供了一个身临其境的廉政世界。 在这个廉政教育VR数字化展厅中&#xff0c…

高中数学:解三角形-大题练习

例题1 解析 第一小问 根据条件等式,我们发现,每一项都含有边,但是,不是每一项都含有角 于是,我们要想到用正弦定理把边换为角来解答该题 第二小问 例题2 解析 第一小问 两个等式条件,各个项都含有边&…

代码随想录算法训练营第十三天|239. 滑动窗口最大值、 347.前 K 个高频元素

239. 滑动窗口最大值 题目链接:滑动窗口最大值 文档讲解:代码随想录 状态:忘了 思路1:使用优先队列来维护滑动窗口中的最大值,确保在每次滑动时能够高效地找到最大值。时间复杂度是 O(n log k)。 题解: cl…

MyBatis的各种查询功能

1、查询: 查询的标签select必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射关系 resultType:自动映射,用于属性名和表中字段名一致的情况 resultMap:自定义映射,用于一对多或多对一或…

每日一练——分糖果2

1103. 分糖果 II - 力扣(LeetCode) /*** Note: The returned array must be malloced, assume caller calls free().*/ int* distributeCandies(int candies, int num_people, int* returnSize) {int num 0;int* arr (int*)malloc(sizeof(int)*num_peo…

C语言 链表经典OJ题

链表经典OJ题 移除链表元素链表的中间节点反转链表合并两个有序链表分割链表 移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head […

贝锐蒲公英异地组网:降低建筑工地远程视频监控成本、简化运维

中联建设集团股份有限公司是一家建筑行业的施工单位,专注于建筑施工,业务涉及市政公用工程施工总承包、水利水电工程施工总承包、公路工程施工总承包、城市园林绿化专业承包等,在全国各地开展有多个建筑项目,并且项目时间周期可能…

多线程新手村5--线程池

1.1 线程池是什么 线程诞生的意义是因为进程的创建/销毁开销太大,所以使用线程提高代码的执行效率;那如果想要进一步提升执行效率,该怎么办呢?有一个方法是使用线程池。 首先,什么是线程池:池就是池子&am…

使用Python绘制南丁格尔图(玫瑰图)

使用Python绘制南丁格尔图(玫瑰图) 南丁格尔图效果代码 南丁格尔图 南丁格尔图(Nightingale Rose Chart),也被称为玫瑰图或极区图,是一种特殊的圆形统计图,用于显示多个类别的数据。它是由弗洛…

鸿蒙开发接口资源调度:【@ohos.workScheduler (延迟任务调度)】

延迟任务调度 本模块提供延迟任务注册、取消、查询的能力。 开发者在开发应用时,通过调用延迟任务注册接口,注册对实时性要求不高的延迟任务,该任务默认由系统安排,在系统空闲时根据性能、功耗、热等情况进行调度执行。 说明&am…