0

0

Quarkus 中使用 JAX-RS 客户端实现可变长度路径参数的正确方法

聖光之護

聖光之護

发布时间:2026-01-25 11:32:02

|

315人浏览过

|

来源于php中文网

原创

Quarkus 中使用 JAX-RS 客户端实现可变长度路径参数的正确方法

quarkus 的 microprofile rest client 中,若需向服务端发送含多级斜杠(如 `/employees/dwight/jobs/...`)的动态路径,直接传入含 `/` 的字符串会被自动 url 编码;正确解法是结合 `@path` 正则表达式与 `@pathparam`,允许匹配任意长度路径段。

在 JAX-RS(以及 Quarkus 所基于的 RESTEasy 实现)中,路径参数默认对 / 字符敏感——它被视为路径分隔符,而非普通字符。当你尝试将类似 "employees/Dwight/jobs/assistantRegionalManager/salary" 作为 @PathParam 传入时,JAX-RS 会将其按 / 拆分并尝试匹配多个路径段,导致 404 或编码异常(如转为 %2F),即使添加 @Encoded 或正则 {var: .*} 也常因写法不严谨而失效。

✅ 正确做法是:在 @Path 中使用支持贪婪匹配的正则表达式 .+,并确保路径变量名与注解一致

@Path("/json")
@RegisterRestClient(configKey = "json-api")
public interface JsonService {

    @GET
    @Path("/{varPath:.+}") // ← 关键:冒号后紧跟正则,且必须用 .+(非 .*),支持跨 / 匹配
    Response getJson(@PathParam("varPath") String endpoint);
}
? 说明: {varPath:.+} 表示“匹配一个或多个任意字符(包括 /)”,且该匹配会吞掉整个后续路径段,直到 URL 结尾或下一个查询参数前为止; 使用 .+ 而非 .* 更安全:.* 在部分实现中可能匹配空字符串,引发歧义; @PathParam("varPath") 中的名称必须与路径模板中 {varPath:...} 的变量名完全一致(区分大小写); 无需 @Encoded —— 因为匹配发生在服务器路由解析阶段,客户端传入的原始字符串将原样注入路径,不经过二次编码。

✅ 调用示例:

DreamGen
DreamGen

一个AI驱动的角色扮演和故事写作的平台

下载
@Inject
@RestClient
JsonService jsonService;

// 自动映射为 GET /json/employees/Dwight/jobs/assistantRegionalManager/salary
Response res1 = jsonService.getJson("employees/Dwight/jobs/assistantRegionalManager/salary");

// 自动映射为 GET /json/games/theLastOfUs/rating
Response res2 = jsonService.getJson("games/theLastOfUs/rating");

⚠️ 注意事项:

  • 确保服务端对应资源路径(如 /json/{varPath:.+})已正确定义并能处理该动态路径;
  • 若路径中可能包含查询参数(如 /json/data?format=json),当前方案不适用——{varPath:.+} 不会捕获 ? 后内容,需改用 @QueryParam 分离处理;
  • 在 Quarkus 2.13+ 中已全面兼容该语法;旧版本建议升级至 LTS 版本(如 2.16+ 或 3.x)以获得稳定支持。

总结:可变长路径的本质不是“绕过编码”,而是让 JAX-RS 路由引擎主动接纳 / 作为路径变量的一部分。通过 @Path("/{var:.+}") + @PathParam 的组合,既符合规范,又零侵入、无额外依赖,是 Quarkus 微服务间动态资源调用的标准实践。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

418

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

76

2025.09.10

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

251

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

745

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

213

2023.08.11

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

58

2026.01.23

热门下载

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

精品课程

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

共101课时 | 8.5万人学习

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

共39课时 | 3.2万人学习

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

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