讲师中心 微信公众号
AI工具推荐 视频效率加速

如何通过提取通用 REST 操作辅助方法避免重复代码

胖浩同学_5637

胖浩同学_5637

发布时间:2026-01-04 13:59:33

|

958人浏览过

|

来源于php中文网

原创

如何通过提取通用 REST 操作辅助方法避免重复代码

本文介绍如何将多个 rest 接口(如 get、delete)中重复的资源校验逻辑(如双 id 查找、归属关系验证)抽取为私有辅助方法,提升代码复用性与可维护性,并给出安全、清晰的实现范式。

在构建 RESTful 服务时,不同 HTTP 方法(如 GET、DELETE、PUT)常需执行相同的前置校验:根据 projectManagerId 和 questionnaireId 分别加载实体,并验证问卷是否归属该项目经理。若每处都重复编写查找 + 校验逻辑,不仅违反 DRY(Don’t Repeat Yourself)原则,还会增加维护成本和出错风险。

理想的解法是将共用逻辑封装为职责单一的私有方法。注意:该辅助方法不应直接返回 DTO 或 void,而应返回核心业务实体(Questionnaire),由调用方按需后续处理(如转换、删除、更新)。这样既保证了复用性,又保持了各接口行为的语义清晰。

以下是重构后的推荐实现:

sc-java-to-ts-interface
sc-java-to-ts-interface

将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。

下载
@Override
public QuestionnaireDTO methodOne(long projectManagerId, long questionnaireId) {
    Questionnaire questionnaire = findById(projectManagerId, questionnaireId);
    return mapToDto(questionnaire); // GET:查后转 DTO
}

@Override
public QuestionnaireDTO methodTwo(long projectManagerId, long questionnaireId) {
    Questionnaire questionnaire = findById(projectManagerId, questionnaireId);
    questionnaireRepository.delete(questionnaire); // DELETE:查后删实体
    return mapToDto(questionnaire); // 可选:返回被删资源的快照(符合 REST 最佳实践)
}

/**
 * 公共校验方法:根据 projectManagerId 和 questionnaireId 加载并验证归属关系
 * @return 已通过权限校验的 Questionnaire 实体
 * @throws ResourceNotFoundException 当任一 ID 未找到时
 * @throws QuestionnaireApiException 当问卷不属于指定项目经理时
 */
private Questionnaire findById(long projectManagerId, long questionnaireId) {
    ProjectManager projectManager = projectManagerRepository.findById(projectManagerId)
            .orElseThrow(() -> new ResourceNotFoundException("ProjectManager", "id", projectManagerId));

    Questionnaire questionnaire = questionnaireRepository.findById(questionnaireId)
            .orElseThrow(() -> new ResourceNotFoundException("Questionnaire", "id", questionnaireId));

    if (!questionnaire.getProjectManager().getId().equals(projectManager.getId())) {
        throw new QuestionnaireApiException(HttpStatus.BAD_REQUEST,
                "Questionnaire not belonging to Project Manager");
    }

    return questionnaire;
}

✅ 关键设计要点说明:

  • 返回实体而非 DTO 或 void:确保调用方灵活决定后续操作(映射、删除、更新等),避免辅助方法承担过多职责;
  • 异常语义明确:复用原异常类型(ResourceNotFoundException、QuestionnaireApiException),保障全局异常处理器一致性;
  • 方法命名精准:findById 直观表达其核心能力(基于 ID 查找+校验),比泛称 validateAndLoad 更具可读性;
  • 无副作用:辅助方法仅做查询与校验,不修改状态,符合函数式设计思想,便于单元测试。

⚠️ 注意事项:

  • 若未来需支持其他资源(如 Survey、Report)的同类校验,可进一步泛型化或抽象为模板方法,但当前场景下简单私有方法已足够简洁高效;
  • 切勿在辅助方法中调用 repository.delete() 或 mapToDto() —— 这会耦合具体业务意图,破坏复用前提;
  • 建议为 findById 添加 JavaDoc,明确契约(输入、输出、异常),提升团队协作效率。

通过这一重构,不仅消除了 IntelliJ 的“duplicated code fragment”警告,更让业务逻辑主干更聚焦、校验逻辑更集中、后续扩展(如增加审计日志、缓存拦截)也有了统一入口。

热门AI工具

更多
PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

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

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

564

2025.11.26

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

636

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

371

2025.11.27

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3188

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5109

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3829

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

466

2026.01.19

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

391

2026.03.13

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn