
在 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 —— 因为匹配发生在服务器路由解析阶段,客户端传入的原始字符串将原样注入路径,不经过二次编码。
✅ 调用示例:
@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 微服务间动态资源调用的标准实践。










