接口参数校验之路径变量:@PathVariable(二):多个路径变量校验

一、引言

在上一篇文章《接口参数校验之路径变量:@PathVariable》中,我们深入探讨了Spring MVC框架中的一个重要特性——路径变量的使用和校验。文章详细阐述了如何通过@PathVariable注解从请求URL中提取路径变量,并对单个路径变量进行合法性校验。强调了这一功能在实现RESTful API设计原则,提升API资源定位精确性以及保证系统安全性和稳定性方面的关键作用。

然而,在实际项目开发过程中,接口设计往往更为复杂多样,我们可能会遇到需要同时处理多个路径变量的情况。例如,在处理具有层级关系的资源时(如获取某个用户的某个订单信息)。

因此,本文将在此基础上进一步展开,详细介绍如何在Spring MVC中优雅且高效地处理和校验多个路径变量,从而帮助开发者更好地应对这类复杂场景下的接口设计与实现挑战。

二、多个路径变量的应用场景分析

  1. 资源层级关系
    在RESTful API设计中,资源通常是通过URL来唯一标识和访问的。当资源之间存在明显的层级关系时,通常会在API路由中体现出来,这时就可能出现多个路径变量。例如,在一个博客系统中,文章评论是依附于具体的文章之下的,所以要获取某个文章下的特定评论,可能会设计如下的API接口:

    GET /articles/{articleId}/comments/{commentId}
    

    在这个例子中,“articleId”和“commentId”就是两个路径变量,分别代表了文章ID和评论ID,它们共同确定了一个具体的评论资源。

  2. 路径变量的特点及其对API路由的影响

    • 可读性强:多个路径变量有助于构建语义明确且直观的API URL结构,使得开发者和使用者能够通过URL直接理解资源间的关系。
    • 路由灵活:通过灵活组合路径变量,API能够支持复杂的查询需求,实现对深层次、关联紧密的数据资源的精确访问。
    • 易于客户端使用:客户端可以根据资源层次直接构造请求URL,无需额外传递参数或在查询字符串中编码复杂关系。
  3. 对业务逻辑的影响

    • 耦合度降低:路径变量明确表达了资源之间的关联,使服务端的路由处理逻辑与业务逻辑更加解耦,提高了代码的可维护性和扩展性。
    • 校验与权限控制:服务端在处理带有多个路径变量的请求时,需要对每一个变量进行有效性验证,并可能涉及到基于不同资源层级的权限控制策略,确保只有授权的用户能访问相应的资源。
    • 缓存优化:清晰的资源层级路径也有助于HTTP缓存机制更有效地识别和区分不同的资源实例,从而提升性能。

    这一段是AI介绍的,作者并没有实际经历过,仅供参考。

三、@PathVariable处理多个路径变量

  1. 定义与注解语法
    在Spring MVC中,我们可以轻松地在一个URL路径模板中定义多个@PathVariable。该注解用于将URL路径中的占位符映射到控制器方法的参数上。例如,在一个URL模板 /users/{userId}/orders/{orderId} 中,userIdorderId 都是路径变量。在对应的控制器方法签名中,可以使用 @PathVariable 注解来标记这两个参数:

    @GetMapping("/users/{userId}/orders/{orderId}")
    public ResponseEntity<Order> getOrder(@PathVariable String userId, @PathVariable String orderId) {
        // 通过 userId 和 orderId 获取并返回订单信息
    }
    

    上述代码中,@PathVariable 注解表明了方法参数应当从请求路径中获取相应的值,并根据类型自动转换(在这个例子中,转换为String类型)。

  2. 实例代码演示
    假设我们有一个简单的电商应用,用户可以查看自己的订单详情。以下是具体的Controller层示例代码:

    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class OrderController {
    
        @GetMapping("/users/{userId}/orders/{orderId}")
        public ResponseEntity<Order> getOrderDetails(@PathVariable("userId") String userId, 
                                                    @PathVariable("orderId") String orderId) {
            // 此处应调用服务层逻辑,根据userId和orderId查询订单
            // 以下仅为模拟查询结果
            Order order = getOrderFromDatabase(userId, orderId);
            if (order != null) {
                return ResponseEntity.ok(order);
            } else {
                return ResponseEntity.notFound().build();
            }
        }
    
        private Order getOrderFromDatabase(String userId, String orderId) {
            // 实现从数据库或其他存储系统根据userId和orderId获取订单的逻辑
            // 这里仅作为示例,实际项目中会替换为真实的服务调用
            return new Order(userId, orderId, "Sample Product", "Delivered");
        }
    }
    
    class Order {
        // 省略构造函数、getter/setter等
        private String userId;
        private String id;
        private String productName;
        private String status;
    
        // ...
    }
    

    在上述示例中,当客户端发起如 GET /users/1/orders/200 的请求时,Spring MVC会自动解析路径中的userId为1,orderId为200,并将其传递给getOrderDetails方法进行处理。

四、多个路径变量校验

校验的关键注解任然是三个:@Validated@PathVariable校验注解(如@Pattern)

核心代码

package com.example.web.user.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.constraints.Pattern;

@Slf4j
@RestController
@RequestMapping
@Tag(name = "用户角色管理")
@Validated
public class UserRoleController {

    @DeleteMapping("users/{userId}/roles/{roleId}")
    @Operation(summary = "删除用户的角色")
    @Parameter(name = "userId", description = "用户ID", example = "1234567890123456789")
    @Parameter(name = "roleId", description = "角色ID", example = "9876543210123456789")
    public void deleteUserRole(@PathVariable @Pattern(regexp = "^\\d{19}$", message = "用户ID,应为19位数字") String userId,
                               @PathVariable @Pattern(regexp = "^\\d{19}$", message = "角色ID,应为19位数字") String roleId) {
        log.info("测试,删除用户的角色");
    }

}

校验不通过

在这里插入图片描述

校验不通过

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/355551.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贝锐蒲公英全新网页认证,保障企业访客无线网络安全

随着企业规模的不断扩大、人员的增长、无线终端数量/类型的增加&#xff0c;传统WiFi无线网络会暴露出越来越多的问题&#xff0c;导致无线网络管理困难。 比如&#xff1a;采用弱密码、安全防护不到位的默认设置、员工缺乏信息安全意识、未经授人员权访问无线网络…… 这些问…

Kafka(九)跨集群数据镜像

目录 1 跨集群镜像的应用场景1.1 区域集群和中心集群1.2 高可用(HA)和灾备(DR)1.3 监管与合规1.4 云迁移1.5 聚合边缘集群的数据 2 多集群架构2.1 星型架构2.2 双活架构2.2 主备架构2.2.1 如何实现Kafka集群的故障转移2.2.1.1 故障转移包括的内容1. 灾难恢复计划2. 非计划内的故…

使用SQL来操作DataFrame?我们给pandas找了个新搭子

对有一定SQL基础的人来说&#xff0c;pandas中的查询会有点繁琐。 在这篇文章&#xff0c;我们将给Pandas找个搭子&#xff0c;在用SQL方便的地方&#xff0c;我们用SQL&#xff1b;在用原生查询方便的地方&#xff0c;我们就用原生查询。 这个搭子会是谁呢&#xff1f; data…

李国武老师解读SPC:提升生产效率与品质的秘诀

近年来&#xff0c;企业对于生产效率和品质的要求越来越高。而SPC&#xff08;统计过程控制&#xff09;作为一种重要的质量管理工具&#xff0c;受到了广泛的关注和应用。在这篇文章中&#xff0c;我们将跟随天行健咨询的李国武老师&#xff0c;深入探讨SPC的核心理念、应用方…

适用智能锁等触摸电子产品-单键/多键触摸触控芯片

智能化产品已成为我们日常生活中不可或缺的一部分&#xff1b;其中&#xff0c;智能锁等触摸电子产品在家居安全领域中扮演着重要的角色&#xff1b;而这些产品的核心技术之一就是单键/多键触摸触控芯片。 单键/多键触摸触控芯片是一种集成了触摸控制功能的芯片&#xff0c;通…

数字化转型是个趋势,对企业来说,数字化转型需要重点关注哪几个方面?

数字化转型确实是企业的一个重要趋势&#xff0c;其成功需要涵盖业务各个方面的全面方法。企业在数字化转型过程中应重点关注以下几个方面&#xff1a; 1.战略愿景和领导力&#xff1a; 制定与总体业务目标相一致的清晰数字战略。确保领导层对数字化转型之旅的承诺和支持。 …

DAY10_SpringBoot—SpringMVC重定向和转发RestFul风格JSON格式SSM框架整合Ajax-JQuery

目录 1 SpringMVC1.1 重定向和转发1.1.1 转发1.1.2 重定向1.1.3 转发练习1.1.4 重定向练习1.1.5 重定向/转发特点1.1.6 重定向/转发意义 1.2 RestFul风格1.2.1 RestFul入门案例1.2.2 简化业务调用 1.3 JSON1.3.1 JSON介绍1.3.2 JSON格式1.3.2.1 Object格式1.3.2.2 Array格式1.3…

第4章 python深度学习——(波斯美女)

第4章 机器学习基础 本章包括以下内容&#xff1a; 除分类和回归之外的机器学习形式 评估机器学习模型的规范流程 为深度学习准备数据 特征工程 解决过拟合 处理机器学习问题的通用工作流程 学完第 3 章的三个实例&#xff0c;你应该已经知道如何用神经网络解决分类问题和回归…

Arduino Uno R3通过ESP-01S连接网络

一、材料准备 Arduino Uno R3开发板 1 USB串口通信数据线&#xff08;Uno开发板使用&#xff09; 1 ESP8266-01S Wi-Fi模块 1 ESP8266固件烧录下载器&#xff08;烧录固件使用&#xff09; 1 WiFi无线收发转接板&#xff08;适用于ESP-01S、ESP-01&#xff09; 杜邦线…

让AI帮你说话--GPT-SoVITS教程

有时候我们在录制视频的时候&#xff0c;由于周边环境嘈杂或者录音设备问题需要后期配音&#xff0c;这样就比较麻烦。一个比较直观的想法就是能不能将写好的视频脚本直接转换成我们的声音&#xff0c;让AI帮我们完成配音呢&#xff1f;在语音合成领域已经有很多这类工作了&…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch01-2 完整定常系统——杆组RRR

本文仅供学习使用,总结很多本现有讲述运动学或动力学书籍后的总结,从矢量的角度进行分析,方法比较传统,但更易理解,并且现有的看似抽象方法,两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有帮助请引用 本文参考: 《空间机构的分析与综合(上册)》-张启先…

【程序员英语】【美语从头学】初级篇(入门)(笔记)Lesson10(电话会话Ⅱ)

《美语从头学初级入门篇》 注意&#xff1a;被 删除线 划掉的不一定不正确&#xff0c;只是不是标准答案。 文章目录 Lesson 10 Telephone Conversation Ⅱ 电话会话&#xff08;二&#xff09;会话A会话B笔记I would like to do&#xff08;Id like to to do&#xff09;我想…

0基础学习VR全景平台篇第139篇:如何用圆周率全景相机拍摄VR全景

新手入门 圆周率科技&#xff0c;成立于2012年&#xff0c;是中国最早投身嵌入式全景算法研发的团队之一&#xff0c;亦是全球市场占有率最大的全景算法供应商。相继推出一体化智能屏、支持一键高清全景直播的智慧全景相机--Pilot Era和Pilot One&#xff0c;为用户带来实时畅…

【智能家居入门之环境信息监测】(STM32、ONENET云平台、微信小程序、HTTP协议)

作为入门本篇只实现微信小程序接收下位机上传的数据&#xff0c;之后会持续发布如下项目&#xff1a;①可以实现微信小程序控制下位机动作&#xff0c;真正意义上的智能家居&#xff1b;②将网络通讯协议换成MQTT协议再实现上述功能&#xff0c;此时的服务器也不再是ONENET&…

电脑风扇控制温度软件 Macs Fan Control Pro 中文

Macs Fan Control Pro是一款专为Mac用户设计的风扇控制软件&#xff0c;旨在提供更精细的风扇转速控制和温度监控。这款软件通过实时监测Mac内部硬件的温度&#xff0c;自动或手动调整风扇的转速&#xff0c;以确保系统温度保持在理想范围内。 Macs Fan Control Pro提供了直观…

C#,广义斐波那契数(Generalised Fibonacci Numbers)的算法

广义斐波那契序列(generalized Fibonacci sequence)是斐波那契数的推广。由递推关系F₁F₂…Fm-10&#xff0c;Fₘ1&#xff0c;FmnFₙFn1…Fnm1&#xff0c;n≥1所产生的序列&#xff0c;称为m级广义斐波那契序列。 计算结果&#xff1a; 源代码&#xff1a; 1 文本格式 …

迅为新品全国产龙芯 3A6000 处理器板卡

龙芯 3A6000 处理器完全自主设计、性能优异&#xff0c;代表了我国自主桌面 CPU 设计领域的最新里程碑成果。龙芯 3A6000 处理器的推出&#xff0c;说明国产 CPU 在自主可控程度和产品性能上已双双达到新高度&#xff0c;也证明了国内有能力在自研 CPU 架构上做出一流的产品。 …

自动验证码解析器:CapSolver的Chrome扩展程序自动解析器

自动验证码解析器&#xff1a;CapSolver的Chrome扩展程序自动解析器 验证码是网站实施的一种安全措施&#xff0c;通常对用户构成挑战。然而&#xff0c;随着技术的进步&#xff0c;验证码解析器已经出现&#xff0c;以简化这一过程。在本文中&#xff0c;我们将探讨专为Googl…

trucksim三车队列仿真 matlab一直闪退问题

Trucksim2019 matlab版本2023a 基本框架应该都清楚 下图是主界面 overlay videos and polots with other runs 模块是 关联另一个车辆模型 核心是下图标红是核心 Number of vehicle codes 选择ALL 不要选

whatsapp相关(五)- frida监测网络请求

Frida监测 网络请求 本文主要记录下frida监测网络请求的过程. 1: 脚本 首先记录下脚本,代码如下: Java.perform(function () {var HttpURLConnection Java.use(java.net.HttpURLConnection);var URL Java.use(java.net.URL);var Proxy Java.use(java.net.Proxy);var ori…
最新文章