如何在Quarkus Rest Client请求中正确配置动态路径?
解决Quarkus Rest Client动态路径含特殊字符被转义的问题
问题根源
用@PathParam声明动态路径片段时,JAX-RS默认会对?、&、=这类特殊字符做URL编码,导致拼接后的请求URL和预期不符,无法正确调用外部API。
解决方案
方案一:用@Encoded注解禁用自动编码
定义Rest Client接口时,通过通配符路径匹配任意动态内容,并给@PathParam参数加上@Encoded注解,让框架不对传入的字符串做编码处理,直接拼接到基础URL后。
示例代码:
@RegisterRestClient(baseUri = "https://你的外部API基础地址") public interface FileDownloadClient { @GET @Path("{dynamicPath:.*}") Response downloadFile(@PathParam("dynamicPath") @Encoded String dynamicPath); }
调用方式:
@Inject @RestClient FileDownloadClient downloadClient; public void handleDownload(String dynamicPathFromUI) { // 直接传入UI返回的完整动态路径字符串 Response response = downloadClient.downloadFile(dynamicPathFromUI); // 后续处理响应逻辑 }
方案二:手动构建完整URL调用
如果不想修改接口的路径定义,可以通过UriBuilder手动拼接基础URL和动态内容,再发起请求。
示例代码:
@Inject @RestClient FileDownloadClient downloadClient; public void handleDownload(String dynamicPathFromUI) { URI fullRequestUri = UriBuilder.fromUri("https://你的外部API基础地址") .path(dynamicPathFromUI) .build(); // 通过代理调用指定URL Response response = downloadClient.proxy().invoke(HttpMethod.GET, fullRequestUri, Response.class); // 后续处理响应逻辑 }
或者直接使用WebTarget:
@Inject RestClientBuilder restClientBuilder; public void handleDownload(String dynamicPathFromUI) { WebTarget target = restClientBuilder.baseUri("https://你的外部API基础地址") .build() .target("/") .path(dynamicPathFromUI); Response response = target.request().get(); // 后续处理响应逻辑 }
注意事项
- 使用
@Encoded时,要确保UI传入的动态内容本身是合法的URL片段,避免包含恶意字符导致请求异常。 - 手动构建URL时,同样要校验动态内容的合法性,防止生成无效请求地址。
内容的提问来源于stack exchange,提问作者A. Ghergus
相关产品推荐
相关产品推荐

