一个好的 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实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!