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会被客户端自动解码一次,因此需要进行二次编码,确保服务器收到的是经过一次解码后的编码值,避免/被当作路径分隔符:
- 目标URL:
https://res.cloudinary.com/doa0jsihz/raw/upload/v1683809593/gr9kzey0yovto2safaah - 第一次编码结果:
https%3A%2F%2Fres.cloudinary.com%2Fdoa0jsihz%2Fraw%2Fupload%2Fv1683809593%2Fgr9kzey0yovto2safaah - 第二次编码结果:
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
相关产品推荐
相关产品推荐

