You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中如何将URL作为@PathVariable参数传递?

问题:如何将URL作为路径参数传入Spring Boot的@GetMapping接口?

我定义了如下Spring Boot接口方法:

@GetMapping("/lr/{requester}/{url}/{col}")
public ResponseEntity<TrainParams> trainUsingLR(
        @PathVariable("requester") String requester,
        @PathVariable("url") String url,
        @PathVariable("col") int col,
        @RequestBody List<String> features)

需要将完整URL传入url路径参数,但尝试两种方式均失败:

  • 方式1:http://localhost:8080/api/ai/lr/0/https%3A%2F%2Fres.cloudinary.com%2Fdoa0jsihz%2Fraw%2Fupload%2Fv1683809593%2Fgr9kzey0yovto2safaah/9,返回400错误
  • 方式2:http://localhost:8080/api/ai/lr/0/https://res.cloudinary.com/doa0jsihz/raw/upload/v1683809593/gr9kzey0yovto2safaah/9,返回404错误

注:已正确添加请求体,传入普通字符串作为url参数时请求正常,请问正确的传参方式是什么?


解决方案

原因分析

Spring MVC默认会将路径中的/视为路径分隔符,直接传入未处理的URL会被拆分成多个路径段,导致接口路径不匹配(404);仅做一次URLEncode时,客户端或浏览器会自动解码一次,服务器收到的仍是带/的字符串,依然会触发路径拆分或参数解析错误(400)。

方法1:对目标URL进行两次URLEncode

第一次编码后的URL会被客户端自动解码一次,因此需要进行二次编码,确保服务器收到的是经过一次解码后的编码值,避免/被当作路径分隔符:

  1. 目标URL:https://res.cloudinary.com/doa0jsihz/raw/upload/v1683809593/gr9kzey0yovto2safaah
  2. 第一次编码结果:https%3A%2F%2Fres.cloudinary.com%2Fdoa0jsihz%2Fraw%2Fupload%2Fv1683809593%2Fgr9kzey0yovto2safaah
  3. 第二次编码结果:https%253A%252F%252Fres.cloudinary.com%252Fdoa0jsihz%252Fraw%252Fupload%252Fv1683809593%252Fgr9kzey0yovto2safaah

最终请求URL:

http://localhost:8080/api/ai/lr/0/https%253A%252F%252Fres.cloudinary.com%252Fdoa0jsihz%252Fraw%252Fupload%252Fv1683809593%252Fgr9kzey0yovto2safaah/9

服务器接收到后会自动解码一次,得到第一次编码的字符串,Spring MVC会正确将其解析为url参数的值。

方法2:修改接口路径,让url参数匹配任意字符(包括/)

修改@GetMapping的路径规则,使用正则表达式.+指定url参数匹配任意字符(包括/),避免路径拆分:

@GetMapping("/lr/{requester}/{url:.+}/{col}")
public ResponseEntity<TrainParams> trainUsingLR(
        @PathVariable("requester") String requester,
        @PathVariable("url") String url,
        @PathVariable("col") int col,
        @RequestBody List<String> features)

此时只需传入一次URLEncode后的URL即可:

http://localhost:8080/api/ai/lr/0/https%3A%2F%2Fres.cloudinary.com%2Fdoa0jsihz%2Fraw%2Fupload%2Fv1683809593%2Fgr9kzey0yovto2safaah/9

注意:此方式下col必须是最后一个路径参数,否则url的匹配会包含后续路径段,导致col无法正确解析。


内容的提问来源于stack exchange,提问作者MathematicsBeginner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:43:29