Java API接口开发规范
文章目录
- 一、命名规范
- 1.1 接口命名
- 1.2 变量命名
- 二、接收参数规范
- 2.1 请求体(Body)
- 2.2 查询参数(Query Parameters)
- 三、参数检验
- 四、接收方式规范
- 五、异常类处理
- 六、统一返回格式的定义
- 七、API接口的幂等性(Idempotence)
- 小结
在软件开发领域,尤其是
Java后端开发中,API接口的设计与开发是连接前端与后端服务的桥梁,其质量和规范性直接影响到系统的可维护性、可扩展性以及用户体验。一个优秀的
API接口设计应当遵循一定的规范,以确保接口的一致性、安全性和易用性。本文将从命名规范、接收参数规范、参数检验、接收方式规范、异常类处理、统一返回格式、幂等性等方面,详细介绍Java后端API接口的开发规范,并通过实际代码示例加以说明。
一、命名规范
1.1 接口命名
RESTful风格:遵循RESTful原则,使用HTTP方法(GET、POST、PUT、DELETE等)来表明对资源的操作。接口URL应直观反映资源及其操作,如/users获取用户列表,/users/{id}获取指定ID的用户。动词+名词:在URL中尽量避免使用动词,而是通过HTTP方法表示操作。但在特定场景下,如复杂查询,可在URL中加入动词描述性的查询参数,如/users/search。驼峰命名:接口名、资源名采用小写驼峰命名法(lowerCamelCase),如getUserById。
1.2 变量命名
- 属性命名:
Java中属性名使用小写驼峰命名法,如userId、userName。 - 常量命名:全部大写,单词间用下划线分隔,如
MAX_USERS。
二、接收参数规范
2.1 请求体(Body)
对于POST、PUT等需要修改服务器状态的操作,推荐使用JSON格式作为请求体。
请求体中的字段应与数据库表或业务对象属性对应,确保数据一致性。
{ "userId": 1, "userName": "JohnDoe", "email": "johndoe@example.com"
}
2.2 查询参数(Query Parameters)
对于GET请求,使用查询参数传递非敏感信息,如分页参数、排序条件等。
查询参数名同样采用小写驼峰命名法,如page=1&size=10。
三、参数检验
前端校验与后端校验结合:虽然前端应进行基本的校验,但后端必须实现全面的校验逻辑,以防止恶意请求。
使用校验框架:如Hibernate Validator,通过注解方式简化校验逻辑。
public class UserDTO { @NotNull(message = "用户ID不能为空") private Long userId; @NotBlank(message = "用户名不能为空") @Size(min = 3, max = 20, message = "用户名长度必须在3到20个字符之间") private String userName; // 其他字段和校验注解...
}
四、接收方式规范
根据内容类型选择接收方式:对于application/json类型的数据,使用@RequestBody注解接收请求体;对于application/x-www-form-urlencoded或multipart/form-data,则可能需要手动解析或使用@RequestParam等注解。
统一使用注解:尽可能利用Spring MVC提供的注解(如@PathVariable、@RequestParam、@RequestBody)来简化代码和增强可读性。
五、异常类处理
自定义异常类:根据项目需求定义一系列自定义异常类,如BusinessException、SystemException等,以区分业务异常和系统异常。
全局异常处理:使用@ControllerAdvice或@RestControllerAdvice注解的类来全局捕获并处理异常,统一返回格式。
@RestControllerAdvice
public class GlobalExceptionHandler { @ExceptionHandler(value = BusinessException.class) public ResponseEntity<Object> handleBusinessException(BusinessException ex) { // 构造返回体,包含错误码、错误信息等 Map<String, Object> body = new HashMap<>(); body.put("code", ex.getCode()); body.put("message", ex.getMessage()); return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST); } // 其他异常处理方法...
}
六、统一返回格式的定义
统一返回格式通常包含以下几个关键部分:
状态码(Code):表示请求处理的结果状态,如成功、失败、未授权等。状态码可以是HTTP状态码,也可以是自定义的业务状态码。自定义状态码可以更加精细地描述业务逻辑的错误类型。消息(Message):与状态码对应的文本描述,用于给调用者提供更多关于请求结果的上下文信息。数据(Data):请求成功时返回的具体数据。如果请求失败,这个部分可能是空的、null,或者包含一些错误信息。时间戳(Timestamp)(可选):记录响应生成的时间,有助于客户端进行缓存控制或日志记录。其他元数据(可选):如分页信息(当前页码、每页数量、总记录数等)、请求ID等,根据具体需求决定是否需要包含。
示例
以下是一个统一返回格式的JSON示例:
{ "code": 200, // 自定义或HTTP状态码 "message": "操作成功", "data": { // 请求成功时返回的数据 "id": 1, "name": "John Doe", "email": "johndoe@example.com" }, "timestamp": "2023-10-01T12:00:00Z", // 可选 "requestId": "abc123" // 可选,用于追踪请求
}
如果请求失败,响应可能会是这样的:
{ "code": 404, // 自定义或HTTP状态码 "message": "未找到用户", "data": null, // 或包含错误信息 "timestamp": "2023-10-01T12:00:00Z", // 可选 "requestId": "def456" // 可选
}
在实现统一返回格式时,可以定义一个或多个基础响应类(如前面提到的BaseResponse类),并在控制器中使用这些类来构造响应。此外,可以使用AOP(面向切面编程)来全局拦截响应,自动包装成统一格式,以减少在每个控制器方法中重复编写相同代码的需要。
七、API接口的幂等性(Idempotence)
API接口的幂等性(Idempotence)是HTTP协议中的一个重要概念,尤其在RESTful API设计中尤为重要。幂等性指的是一个操作,无论执行多少次,其结果都相同,且不会对系统状态产生副作用(除了那些因为副作用而特意设计的操作,如日志记录)。
在API接口设计中,幂等性主要关注于HTTP方法的使用以及接口设计本身如何保证操作的唯一性和结果的一致性。
HTTP方法与幂等性
HTTP协议定义了多种方法,每种方法都有其特定的语义和幂等性属性:
GET:幂等方法。用于请求资源,不会对服务器上的资源进行修改,因此无论调用多少次,结果都是相同的。POST:非幂等方法。用于提交数据给服务器处理,每次调用都可能产生不同的结果(例如,创建新的资源)。PUT:幂等方法(在RESTful原则下)。用于更新资源,如果多次使用相同的请求体对同一资源进行PUT操作,那么资源的状态应该是相同的。但请注意,实际实现中可能存在差异,因为服务器可能根据请求的具体内容来决定是否更新资源。DELETE:幂等方法(在大多数情况下)。用于删除资源,如果资源已经被删除,那么再次执行DELETE操作通常不会有任何影响(尽管有些服务器可能会返回不同的状态码来指示资源是否已存在)。PATCH:非幂等方法。用于对资源进行部分修改,由于每次修改的内容可能不同,因此不是幂等的。
实现API接口的幂等性
要在API接口中实现幂等性,可以考虑以下几种策略:
- 使用
幂等性HTTP方法:优先选择GET、PUT和DELETE方法来设计API接口,因为它们更容易实现幂等性。 唯一标识符:对于非幂等的方法(如POST),可以通过在请求中包含唯一标识符(如请求ID、令牌等)来确保操作的幂等性。服务器可以检查这个标识符,如果之前已经处理过相同的请求,则可以直接返回之前的结果,而不是再次执行操作。状态检查:在执行操作之前,先检查资源的当前状态。如果资源已经处于期望的状态,则可以直接返回成功响应,而无需执行任何操作。乐观锁:在更新资源时,使用版本号或时间戳等乐观锁机制来确保操作的幂等性。如果资源的当前版本与请求中指定的版本不匹配,则拒绝更新请求。去重队列:将请求发送到去重队列中,队列在发送请求到实际处理服务之前会检查请求是否已经处理过。
注意事项
幂等性并不意味着操作没有副作用。例如,GET请求可能会记录日志或更新缓存,但这些副作用不会改变资源的核心状态。
在设计API接口时,应明确指出哪些操作是幂等的,并在文档中说明这一点。
幂等性的实现可能需要额外的开销,如检查请求ID、维护版本号等。因此,在设计API接口时,应根据实际需求权衡幂等性的必要性和实现的复杂性。
小结
通过遵循上述Java后端API接口开发规范,可以显著提升代码的可读性、可维护性和安全性。命名规范、接收参数规范、参数检验、接收方式规范、异常类处理以及统一返回格式等实践,不仅有助于团队成员之间的协作,也为前端开发者提供了清晰、一致的接口文档。此外,安全性考虑也是不可忽视的一环,它直接关系到系统的稳定性和用户数据的安全。
相关文章:
Java API接口开发规范
文章目录 一、命名规范1.1 接口命名1.2 变量命名 二、接收参数规范2.1 请求体(Body)2.2 查询参数(Query Parameters) 三、参数检验四、接收方式规范五、异常类处理六、统一返回格式的定义七、API接口的幂等性(Idempote…...
Go语言实现长连接并发框架 - 任务管理器
文章目录 前言接口结构体接口实现项目地址最后 前言 你好,我是醉墨居士,我们上篇博客实现了路由分组的功能,接下来这篇博客我们将要实现任务管理模块 接口 trait/task_mgr.go type TaskMgr interface {RouterGroupStart()StartWorker(tas…...
【大数据】深入解析分布式数据库:架构、技术与未来
目录 1. 分布式数据库的定义2. 架构类型2.1 主从架构2.2 同步与异步复制2.3 分片架构 3. 技术实现3.1 一致性模型3.2 CAP理论3.3 数据存储引擎 4. 应用场景5. 选择分布式数据库的因素5.1 数据一致性需求5.2 读写负载5.3 成本5.4 技术栈兼容性 6. 未来发展趋势总结 分布式数据库…...
uniapp框架中实现文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间
前言 uni-file-picker是uniapp中的一个文件选择器组件,用于选择本地文件并返回选择的文件路径或文件信息。该组件支持选择单个文件或多个文件,可以设置文件的类型、大小限制,并且可以进行文件预览。 提示:以下是本篇文章正文内容,下面案例可供参考 uni-file-picker组件具…...
GEE教程:NASA/GRACE/MASS_GRIDS/LAND数据的查看不同时期液态水数据的变化情况
目录 简介 NASA/GRACE/MASS_GRIDS/LAND 函数 first() Arguments: Returns: Image 代码 结果 简介 利用NASA/GRACE/MASS_GRIDS/LAND数据的查看不同时期液态水数据的变化情况。 NASA/GRACE/MASS_GRIDS/LAND NASA/GRACE/MASS_GRIDS/LAND数据是由NASA的重力恒星MASS数据…...
世邦通信股份有限公司IP网络对讲广播系统RCE
漏洞描述 SPON世邦IP网络广播系统采用的IPAudio™技术, 将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输的双向音频扩声系统。传统广播系统存在的音质不佳,传输距离有限,缺乏互动等问题。该系统设备使用简便,…...
爬虫——爬取小音乐网站
爬虫有几部分功能??? 1.发请求,获得网页源码 #1.和2是在一步的 发请求成功了之后就能直接获得网页源码 2.解析我们想要的数据 3.按照需求保存 注意:开始爬虫前,需要给其封装 headers {User-…...
5G NR SSB简介
文章目录 SSB介绍SSB波束扫描 SSB介绍 5G NR 引入了SSB 这个概念,同步信号和PBCH块(Synchronization Signal and PBCH block, 简称SSB) 它由主同步信号(Primary Synchronization Signals, 简称PSS)、辅同步信号(Secondary Synchronization Signals, 简称SSS)、PBCH…...
java将mysql表结构写入到word表格中
文章目录 需要的依赖 需要的依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version> </dependency> <!--07版本的,行数不受限制--> <dependency>&l…...
SpringBoot教程(安装篇) | Docker Desktop的安装(Windows下的Docker环境)
SpringBoot教程(安装篇) | Docker Desktop的安装(Windows下的Docker环境) 前言如何安装Docker Desktop资源下载安装启动(重点)1. 检查 bcdedit的hypervisorlaunchtype是否为Auto2. 检查CPU是否开启虚拟化3.…...
day2网络编程项目的框架
基于终端的 UDP云聊天系统 开发环境 Linux 系统GCCUDPmakefilesqlite3 功能描述 通过 UDP 网络使服务器与客户端进行通信吗,从而实现云聊天。 Sqlite数据库 用户在加入聊天室前,需要先进行用户登录或注册操作,并将注册的用户信息…...
C++和OpenGL实现3D游戏编程【连载13】——多重纹理混合详解
🔥C++和OpenGL实现3D游戏编程【目录】 1、本节要实现的内容 前面说过纹理贴图能够大幅提升游戏画面质量,但纹理贴图是没有叠加的。在一些游戏场景中,要求将非常不同的多个纹理(如泥泞的褐色地面、绿草植密布的地面、碎石遍布的地面)叠加(混合)起来显示,实现纹理间能够…...
探索云计算中的 Serverless 架构:未来的计算范式?
目录 引言 一、Serverless架构概览 二、Serverless 架构的优势 三、Serverless架构的挑战 四、Serverless架构的未来展望 五、结论 引言 在当今快速发展的 IT 行业中,云计算无疑占据了举足轻重的地位。随着技术的不断演进,云计算的一个新兴分支——…...
爬虫及数据可视化——运用Hadoop和MongoDB数据进行分析
作品详情 运用Hadoop和MongoDB对得分能力数据进行分析; 运用python进行机器学习的模型调理,利用Pytorch框架对爬取的评论进行情感分析预测; 利用python和MySQL对网站的数据进行爬取、数据清洗及可视化。...
扩散引导语言建模(DGLM):一种可控且高效的AI对齐方法
随着大型语言模型(LLMs)的迅速普及,如何有效地引导它们生成安全、适合特定应用和目标受众的内容成为一个关键挑战。例如,我们可能希望语言模型在与幼儿园孩子互动时使用不同的语言,或在撰写喜剧小品、提供法律支持或总结新闻文章时采用不同的风格。 目前,最成功的LLM范式是训练…...
LeetCode hot100---数组及矩阵专题(C++语言)
1、最大子数组和 (1)题目描述以及输入输出 (1)题目描述: 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 (2)输入输出描述: 输入&#…...
LabVIEW提高开发效率技巧----快速实现原型和测试
在LabVIEW开发中,DAQ助手(DAQ Assistant)和Express VI为快速构建原型和测试功能提供了极大的便利,特别适合于简单系统的开发和早期验证阶段。 DAQ助手:是一种可视化配置工具,通过图形界面轻松设置和管理数据…...
大论文记录
基础知识回顾 1.强化学习(Agent、Environment) 在 RL 中,代理通过不断与环境交互、以试错的方式进行学习,在不确定性下做出顺序决策,并在探索(新领域)和开发(使用从经验中学到的知识ÿ…...
蘑菇分类检测数据集 21类蘑菇 8800张 带标注 voc yolo
蘑菇分类检测数据集 21类蘑菇 8800张 带标注 v 蘑菇分类检测数据集 21类蘑菇 8800张 带标注 voc yolo 蘑菇分类检测数据集介绍 数据集名称 蘑菇分类检测数据集 (Mushroom Classification and Detection Dataset) 数据集概述 该数据集专为训练和评估基于YOLO系列目标检测模型…...
dockerhub 镜像拉取超时的解决方法
在几个月前,因为一些原因,导致 dockerhub 官网上面的镜像拉取超时,目前可以通过修改仓库地址,通过 daocloud 拉取 public-image-mirror 方式一 源仓库替换仓库cr.l5d.iol5d.m.daocloud.iodocker.elastic.coelastic.m.daocloud.io…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
ABAP设计模式之---“Tell, Don’t Ask原则”
“Tell, Don’t Ask”是一种重要的面向对象编程设计原则,它强调的是对象之间如何有效地交流和协作。 1. 什么是 Tell, Don’t Ask 原则? 这个原则的核心思想是: “告诉一个对象该做什么,而不是询问一个对象的状态再对它作出决策。…...
篇章一 论坛系统——前置知识
目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...
