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

Android Retrofit 2.9.0 如何向@Url标注的全路径中传入路径参数

问题原因

你当前的写法无法生效,Retrofit的@Path注解仅会解析*接口请求注解(如@GET、@POST后跟随的路径字符串)*中的占位符,不会对@Url传入的全路径字符串做自动占位符替换。

解决方案

方案1:使用规范的BaseUrl配置(推荐)

如果接口的域名固定,不需要动态切换不同域名,直接把路径配置到@GET注解中即可,@Path可以正常识别占位符:

// 域名配置到Retrofit实例的baseUrl中即可
@GET("/v2/products/{code}/search")
fun searchProductV2(
    @Path("code") storeCode: String,
    @Query("searchCriteria[pageSize]") pageSize: String,
    @QueryMap apiSearchCriteria: Map<String, String>,
    @HeaderMap headerMap: Map<String, String> = emptyMap()
): Single<Products>

方案2:确实需要动态传入全路径

如果业务要求必须动态传入不同的完整接口路径,提前手动替换路径中的占位符再传给@Url参数即可:

  1. 先修改接口定义,删除无效的@Path参数
@GET
fun searchProductV2(
    @Url fullPath: String,
    @Query("searchCriteria[pageSize]") pageSize: String,
    @QueryMap apiSearchCriteria: Map<String, String>,
    @HeaderMap headerMap: Map<String, String> = emptyMap()
): Single<Products>
  1. 调用接口前手动替换占位符
// 替换占位符,注意对storeCode做URL编码避免特殊字符异常
val originPath = "https://myBaseUrl/v2/products/{code}/search"
val encodedCode = URLEncoder.encode(yourStoreCode, StandardCharsets.UTF_8.name())
val finalFullPath = originPath.replace("{code}", encodedCode)
// 传入替换完成的路径调用接口
api.searchProductV2(finalFullPath, pageSize, searchCriteria, headerMap)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:27:03