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

Quarkus中JAX-RS/MicroProfile客户端的变长端点实现问题

解决RestClient传递含斜杠的路径参数问题

针对你遇到的需求——通过RestClient调用API时,传递包含斜杠的动态路径且不被编码,以下两种可行方案可以解决问题:

方案一:@Encoded注解+路径正则匹配

修改JsonService接口,确保路径参数的正则匹配正确,并在参数上添加@Encoded注解,告知框架不对该参数进行编码:

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

    @GET
    @Path("{endpoint:.*}") // 正则匹配任意路径内容(含斜杠)
    Response getJson(@PathParam("endpoint") @Encoded String endpoint);
}

调用示例:

// 直接传入带斜杠的路径字符串
Response response = jsonService.getJson("employees/Dwight/jobs/assistantRegionalManager/salary");

此方案中,@Path("{endpoint:.*}")会匹配/json/之后的所有路径内容,@Encoded注解阻止框架对参数中的斜杠进行URL编码,最终请求路径会正确拼接为/json/employees/Dwight/jobs/assistantRegionalManager/salary。

方案二:使用List<PathSegment>拆分路径段

如果不想依赖@Encoded,可以将路径拆分为多个PathSegment实例,每个实例对应一个斜杠分隔的路径段:

接口定义

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

    @GET
    @Path("{segments:.*}")
    Response getJson(@PathParam("segments") List<PathSegment> segments);
}

调用方式

将目标路径拆分为单个路径段,构造PathSegment列表传入:

// 拆分路径为独立段,构造PathSegment实例
List<PathSegment> pathSegments = Arrays.asList(
    new PathSegment() {
        @Override
        public String getPath() {
            return "employees";
        }

        @Override
        public MultivaluedMap<String, String> getMatrixParameters() {
            return new MultivaluedHashMap<>();
        }
    },
    new PathSegment() {
        @Override
        public String getPath() {
            return "Dwight";
        }

        @Override
        public MultivaluedMap<String, String> getMatrixParameters() {
            return new MultivaluedHashMap<>();
        }
    },
    // 依次添加后续路径段:jobs、assistantRegionalManager、salary
);

Response response = jsonService.getJson(pathSegments);

若使用Quarkus/Resteasy环境,可使用PathSegmentImpl简化构造:

List<PathSegment> pathSegments = Arrays.asList(
    PathSegmentImpl.valueOf("employees"),
    PathSegmentImpl.valueOf("Dwight"),
    PathSegmentImpl.valueOf("jobs"),
    PathSegmentImpl.valueOf("assistantRegionalManager"),
    PathSegmentImpl.valueOf("salary")
);

此方案通过拆分路径段,让框架自动拼接成正确的路径,无需担心编码问题。

注意事项

  • 若之前尝试@Encoded无效,检查是否将注解加在了参数上(而非方法或类上),且路径正则表达式无多余空格(应为{endpoint:.*}而非{endpoint: .*})。
  • 使用List<PathSegment>时,每个路径段不能包含斜杠,必须是拆分后的独立部分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:15:40