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参数即可:
- 先修改接口定义,删除无效的
@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>
- 调用接口前手动替换占位符
// 替换占位符,注意对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
相关产品推荐
相关产品推荐

