0

0

RESTful API 设计:路径参数与请求体对象的职责分离实践

花韻仙語

花韻仙語

发布时间:2026-02-09 11:12:21

|

683人浏览过

|

来源于php中文网

原创

RESTful API 设计:路径参数与请求体对象的职责分离实践

rest api 设计中,应严格区分资源标识(由 @pathvariable 承担)与资源状态数据(由 @requestbody 承担);将路径参数“注入”到请求体对象中违背了关注点分离原则,不仅破坏语义一致性,也增加序列化/反序列化风险和维护成本。

REST 的核心理念之一是 资源导向(Resource-Oriented Architecture):URI 应唯一标识资源或资源集合,而 HTTP 方法定义操作意图。你当前的端点:

POST /v1/myapi/bank/{bank_id}/branch/{branch_id}

从语义上强烈暗示这是一个对已存在分支资源的更新操作(如 PUT 或 PATCH),而非创建新分支。而 POST 通常用于在集合下创建新资源,其标准形式应为:

POST /v1/myapi/bank/{bank_id}/branches   ← 推荐:在 bank 下创建 branch 集合成员

此时 {bank_id} 是父资源标识,branches 是子资源集合名(复数、名词、无 ID),符合 REST 约定。

为什么将 bankId/branchId 塞入 BankDetails 是不良实践?

  • 语义污染:BankDetails 本应仅描述分支自身的业务属性(如 address, zip),不应承担路由上下文职责;
  • 序列化风险:@JsonProperty(access = JsonProperty.Access.READ_ONLY) 仅影响 Jackson 反序列化行为,但若该对象后续被序列化(如发往 SQS),bankId/branchId 仍可能意外暴露或被消费方误用;
  • 职责混淆:控制器层本应负责协调——解析路径、校验权限、组装领域对象——而非“修补” DTO 结构;
  • 测试与复用困难:该 BankDetails 类因耦合路径参数,难以脱离 Web 层独立单元测试,也无法安全用于其他场景(如内部服务调用、消息消费者)。

✅ 推荐方案:保持 DTO 纯净,显式组合上下文

定义清晰、专注的 DTO:

OmniAudio
OmniAudio

OmniAudio 是一款通过 AI 支持将网页、Word 文档、Gmail 内容、文本片段、视频音频文件都转换为音频播客,并生成可在常见 Podcast ap

下载
public class BankBranchCreationRequest {
    private String address;
    private String zip;
    // no bankId/branchId here —— they're not part of the *resource state*

    // constructors, getters, setters
}

在 Controller 中解耦处理:

@PostMapping("/v1/myapi/bank/{bank_id}/branches")
public ResponseEntity createBankBranch(
        @PathVariable("bank_id") String bankId,
        @RequestBody BankBranchCreationRequest request) {

    // ✅ 正确做法:构造领域对象或消息载荷时,显式组合上下文
    BankBranchCommand command = BankBranchCommand.builder()
            .bankId(bankId)
            .address(request.getAddress())
            .zip(request.getZip())
            .build();

    // 发送至 SQS(例如封装为 JsonMessage)
    sqsService.sendMessage(new BranchCreationMessage(bankId, command));

    return ResponseEntity.ok(new MyResponse("created"));
}
? 提示:BranchCreationMessage 是专为消息队列设计的传输对象(DTO for transport),它可安全包含 bankId 和业务字段,且与 Web 层 DTO 完全隔离。

? 关键原则总结

  • URI 表达资源层级,不表达动作或参数:/bank/{id}/branches 是集合;/branch/{id} 是单个资源;
  • @RequestBody 只承载资源的“状态”:即创建或更新时客户端明确提交的数据;
  • 路径变量属于“请求上下文”,应在 Controller 或 Service 层参与逻辑编排,而非污染数据模型;
  • 面向消息场景(如 SQS)应定义专用消息结构,避免复用 Web DTO,保障演进自由度与类型安全。

遵循此模式,你的 API 更易理解、测试、扩展,也更符合 Spring 生态与云原生架构的最佳实践。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

118

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

74

2026.01.26

PHP API接口开发与RESTful实践
PHP API接口开发与RESTful实践

本专题聚焦 PHP在API接口开发中的应用,系统讲解 RESTful 架构设计原则、路由处理、请求参数解析、JSON数据返回、身份验证(Token/JWT)、跨域处理以及接口调试与异常处理。通过实战案例(如用户管理系统、商品信息接口服务),帮助开发者掌握 PHP构建高效、可维护的RESTful API服务能力。

170

2025.11.26

resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

164

2023.12.20

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

445

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

429

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

2790

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2373

2024.08.16

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

98

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 9万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号