RESTful设计与参数校验详解
RESTful设计与参数校验详解定位第 03 篇讲透 REST 设计规范、版本管理、Bean Validation 校验体系与错误响应标准化适用版本Spring Framework 6.xJDK 17目录一、REST 设计规范二、版本管理三、参数校验四、错误响应标准化五、总结六、常见高频面试题一、REST 设计规范1.1 核心原则原则要点资源化一切皆资源用名词标识/orders/{id}不用动词避免/getOrder无状态每个请求自带鉴权与上下文服务端不存会话利于水平扩展统一接口用 HTTP 方法与状态码表达语义而非自定义动词1.2 资源命名与集合复数名词 /orders、/users 层级表达从属 /users/{id}/orders用户的订单 动作用子资源 /orders/{id}/refundPOST动作即资源 避免/getUsers、/deleteOrder、URL 里带动词1.3 状态码规范必记状态码语义200成功有响应体201创建成功常带 Location204成功、无内容如删除400请求参数错误401未认证没登录/凭证无效403已认证但无权限404资源不存在409冲突如重复创建422语义校验失败500服务端错误1.4 查询、分页、过滤过滤 /orders?statusPAIDuserId1 分页 /orders?page0size20 排序 /orders?sortcreateTime,desc二、版本管理策略做法特点URI 版本/v1/orders、/v2/orders直观、易路由最常用头版本Accept: application/vnd.api.v2json更纯但不直观参数版本?version2少用兼容性纪律呼应接口契约加字段向后兼容删字段、改类型、改语义必须升版本旧版本保留过渡期后下线。三、参数校验3.1 Bean Validation 注解publicclassUserCreateReq{NotBlank(message用户名不能为空)privateStringname;Email(message邮箱格式错误)privateStringemail;Min(value0)Max(value150)privateIntegerage;Size(max20)privateStringnickname;}3.2 触发与失败处理PostMappingUsercreate(RequestBodyValidUserCreateReqreq){...}Valid/Validated触发校验失败抛MethodArgumentNotValidException交全局异常处理转 400 字段级错误信息。3.3 进阶特性用法嵌套校验对象字段上加Valid校验内部对象的约束分组校验Validated(Create.class)注解上标分组自定义约束自定义注解 ConstraintValidator如手机号方法级校验类上 Validated校验方法参数配合 AOP四、错误响应标准化4.1 ProblemDetailRFC 7807Boot 3 内置{type:about:blank,title:Bad Request,status:400,detail:用户名不能为空,instance:/users}Boot 3 可开启spring.mvc.problemdetails.enabledtrue让默认错误走该格式。4.2 自定义统一错误体RestControllerAdvicepublicclassGlobalExceptionHandler{ExceptionHandler(MethodArgumentNotValidException.class)ResponseEntityApiErrorinvalid(MethodArgumentNotValidExceptione){// 提取各字段错误 → 400 结构化错误体}ExceptionHandler(BizException.class)ResponseEntityApiErrorbiz(BizExceptione){returnResponseEntity.badRequest().body(ApiError.of(e.getCode(),e.getMessage()));}}要点业务错误码 人类可读消息 字段级明细状态码与错误语义对齐细节见 04 篇异常体系。五、总结REST 规范资源化名词复数、无状态、HTTP 方法与状态码表达语义查询/分页/排序走查询参数。状态码201 创建、204 无内容、401 未认证、403 无权限、409 冲突、422 校验失败——与语义对齐而非全 200。版本管理URI 版本最常用加字段兼容、破坏性变更升版本。校验Bean Validation 注解 Valid 触发 全局异常转 400支持嵌套/分组/自定义约束。错误标准化ProblemDetailRFC 7807或自定义统一错误体业务码 可读消息 字段明细。六、常见高频面试题1. 什么是 REST核心设计原则有哪些要点REST 是以资源为中心的架构风格。原则资源化用名词标识资源如 /orders/{id}统一接口用 HTTP 方法表达操作、状态码表达结果无状态请求自带鉴权服务端不存会话利于水平扩展分层系统与按需代码可选。资源用复数名词、层级表达从属避免动词式 URL。2. HTTP 方法中哪些是幂等的为什么重要要点幂等指同一请求执行一次与多次效果相同。GET、PUT、DELETE 幂等POST、PATCH 非幂等通常。重要性幂等性决定能否安全重试——网络超时后幂等请求可放心重发非幂等重试可能重复创建/扣款。这与分布式重试纪律一致非幂等需幂等键或禁止重试。3. 常见状态码的语义401 和 403 的区别要点200 成功、201 创建成功、204 成功无内容、400 参数错误、404 资源不存在、409 冲突、500 服务端错误。401 未认证——身份凭证缺失或无效“你是谁不知道”应引导登录403 已认证但无权限“知道你是谁但不能做”。混用会导致前端无法正确处理该跳登录还是提示无权限。4. Spring 里如何做参数校验要点用 Bean ValidationJakarta Validation。入参 DTO 上标约束注解NotBlank/Email/Min/Size 等控制器方法参数上加 Valid 或 Validated 触发校验失败抛 MethodArgumentNotValidException用 RestControllerAdvice 全局捕获转成 400 字段级错误信息。支持嵌套校验字段加 Valid、分组校验、自定义约束注解。5. 如何自定义校验规则如手机号要点定义注解Phone用 Constraint 关联校验器实现 ConstraintValidatorPhone, String在 isValid 写校验逻辑正则。注解即可像内置注解一样用在字段上随 Valid 触发。适合内置注解无法覆盖的业务规则手机号、证件号、自定义业务合法性复用且集中。6. 为什么推荐统一错误响应格式要点统一错误体状态码 业务错误码 可读消息 字段明细让前端/调用方可编程地处理错误按错误码分支、展示消息而不是解析各异的堆栈或自由格式也利于网关聚合与日志关联。实现用 RestControllerAdvice 全局异常处理器把各类异常映射为统一结构Boot 3 可直接用 ProblemDetailRFC 7807标准。7. API 版本管理怎么做要点常见三种——URI 版本/v1/、/v2/最直观易路由、请求头版本Accept 带版本更纯但不直观、参数版本少用。兼容纪律加字段向后兼容删字段/改类型/改语义必须升版本旧版本保留过渡期并公告下线时间。目标是让演进不破坏存量客户端。8. 校验失败应该返回什么状态码要点入参格式/约束校验失败通常返回 400Bad Request并带字段级错误明细语义层面的失败格式对但业务不满足可用 422Unprocessable Entity。关键是响应体包含哪个字段、什么原因便于客户端修正。不要返回 500那是服务端问题也不要 200 包错误码状态码与语义应对齐。9. Valid 和 Validated 的区别要点都触发 Bean Validation。Valid 是 Jakarta 标准注解支持嵌套校验在对象字段上标注校验内部对象可用于字段/参数Validated 是 Spring 的扩展支持分组校验Validated(Group.class)用于类/方法/参数类上标注还能启用方法级校验配合 AOP。日常参数校验两者皆可需要分组或方法级校验用 Validated需要嵌套用 Valid。10. 无状态对设计有什么影响要点服务端不在内存/会话中保存客户端状态每个请求自带全部所需信息如 Token。影响① 水平扩展容易——请求可打到任意实例无需会话粘滞② 鉴权用自包含凭证JWT或集中会话存储Redis③ 需要上下文的场景显式传递请求头/参数。代价是每请求传凭证与可能的重复解析用缓存缓解。

相关新闻

YOLOv9道路场景落地:数据适配比模型更新更重要

YOLOv9道路场景落地:数据适配比模型更新更重要

简介:本资源是一套面向计算机相关专业学生与AI初学者的智慧交通目标检测实战项目,基于YOLOv9实现道路场景下的车辆与行人识别、检测与实时计数功能,适用于毕业设计、课程设计及深度学习入门实践。压缩包共182个文件,含83个Python源…

2026/10/13 17:03:52 阅读更多 →
程序员专属词表实操:Python、Java、Rust技术词汇怎么用“离谱指南“速通

程序员专属词表实操:Python、Java、Rust技术词汇怎么用“离谱指南“速通

程序员专属词表实操:Python、Java、Rust技术词汇怎么用"离谱指南"速通 【免费下载链接】up 人生进阶指南 韩先凯的人生进阶指南 英语学习指南 离谱的人生 AI时代终身学习:AI、学习、创业与成长。 项目地址: https://gitcode.com/GitHub_Tren…

2026/10/13 1:56:50 阅读更多 →
服务器安全巡检实战:账号、端口、进程、日志四件套检查与脚本化落地

服务器安全巡检实战:账号、端口、进程、日志四件套检查与脚本化落地

简介:这是一份面向运维工程师、系统管理员及安全从业者的服务器安全巡检实操文档,围绕日常巡检的规范流程与落地方法展开,帮助读者建立可执行的服务器安全自查机制。文档以安全管理为主线,依次讲解巡检的重要性、关注点、覆盖内容…

2026/10/13 1:56:54 阅读更多 →

最新新闻

glibc内存管理核心:malloc/free原理、RSS异常排查与调优实践

glibc内存管理核心:malloc/free原理、RSS异常排查与调优实践

搞了十多年Linux服务端,我遇到过不少内存方面的疑难杂症:程序跑着跑着RSS飙到十几个GB,看代码却找不到任何泄漏;压力测试一过进程就被OOM干掉;线上明明有内存空闲,服务却越跑越慢。这些问题表面上是业务逻辑…

2026/10/14 0:15:46 阅读更多 →
SpringBoot2+Vue3构建医院资源管理系统实战

SpringBoot2+Vue3构建医院资源管理系统实战

1. 项目概述与核心价值医院资源管理系统作为医疗信息化建设的核心组成部分,其技术选型与架构设计直接关系到医疗机构的运营效率。这套基于SpringBoot2Vue3MyBatis-PlusMySQL8.0的技术栈组合,代表了当前企业级应用开发的主流技术方向。我在三甲医院信息化…

2026/10/14 0:15:46 阅读更多 →
easy-peasy Reducer TypeScript API:用 Reducer<State, Action> 为 Redux 风格 Reducer 添加完整类型

easy-peasy Reducer TypeScript API:用 Reducer<State, Action> 为 Redux 风格 Reducer 添加完整类型

前端 【免费下载链接】easy-peasy Vegetarian friendly state for React 项目地址: https://gitcode.com/gh_mirrors/ea/easy-peasy 点击查看 免费下载 本篇围绕 easy-peasy 的 TypeScript API 中的 Reducer 类型展开,讲解如何在模型声明中为“标准 Red…

2026/10/14 0:15:46 阅读更多 →
EFK日志监控系统从零搭建:Elasticsearch+Filebeat+Kibana实战指南

EFK日志监控系统从零搭建:Elasticsearch+Filebeat+Kibana实战指南

直接说结论:如果你团队里缺一套能随时查线上日志、能统计错误趋势、能按关键字秒级定位问题的系统,EFK三件套是目前最稳妥的选择。Elasticsearch负责存储和检索,Filebeat轻量采集日志,Kibana负责可视化。三者合起来,就…

2026/10/14 0:15:46 阅读更多 →
二叉树指定结点层次计算:递归与迭代实现及工程实践

二叉树指定结点层次计算:递归与迭代实现及工程实践

1. 从一道经典题说起:为什么"求结点层次"值得单独拎出来讲但凡刷过二叉树相关题目的人,大概率都见过这道题:给一棵二叉树,再给一个目标结点,问这个结点在第几层。很多人第一反应是"这不就是遍历的时候顺…

2026/10/14 0:15:46 阅读更多 →
Lorenz吸引子实战指南:从混沌方程到三维相图可视化

Lorenz吸引子实战指南:从混沌方程到三维相图可视化

1. 为什么一张“蝴蝶翅膀”能搅动整个非线性科学界?你可能在科普视频里见过它:两条螺旋状轨迹,像一对缓缓张开的蝴蝶翅膀,在三维空间里永不停歇地缠绕、分离、再靠近——它不是艺术渲染,而是Lorenz系统在特定参数下自动…

2026/10/14 0:14:45 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →