Android - retrofit 2.9.0
我有以下改造方法。我正在使用 @Url 来包含基本 url 和搜索产品的路径。但是,我需要通过 code
作为路径的一部分。由于我需要包含完整路径,如何将代码添加到完整的 url 路径中?"https://myBaseUrl/v2/products/{code}/search"
@GET
fun searchProductV2(
@Path("code") storeCode: String,
@Url fullPath: String = "https://myBaseUrl/v2/products/{code}/search",
@Query("searchCriteria[pageSize]") pageSize: String,
@QueryMap apiSearchCriteria: Map<String, String>,
@HeaderMap headerMap: Map<String, String> = emptyMap()
): Single<Products>
最佳答案
您正在尝试的内容将不起作用,因为如果您指定 @Url
,它需要一个静态 URL,它不需要 @Path
考虑到。
解决方案一
删除 @Path
参数,只需在 @Url
中发送格式化字符串.
您的方法声明将如下所示:
@GET
fun searchProductV2(
@Url fullPath: String,
@Query("searchCriteria[pageSize]") pageSize: String,
@QueryMap apiSearchCriteria: Map<String, String>,
@HeaderMap headerMap: Map<String, String> = emptyMap()
): Single<Products>
和你的fullPath
参数可以这样初始化:val fullPath = "https://myBaseUrl/v2/products/%s/search".format("storeCode")
解决方案二 更好的方法是 不是 使用
String
作为 @Url
范围。(
@Url
可以是 okhttp3.HttpUrl
、String
、java.net.URI
或 android.net.Uri
)这是一个使用
android.net.Uri
的示例:您的方法声明将如下所示:
@GET
fun searchProductV2(
@Url fullPath: Uri,
@Query("searchCriteria[pageSize]") pageSize: String,
@QueryMap apiSearchCriteria: Map<String, String>,
@HeaderMap headerMap: Map<String, String> = emptyMap()
): Single<Products>
和你的fullPath
参数可以这样初始化:val fullPath = Uri.parse("https://myBaseUrl/v2/products/%s/search".format("storeCode"))
为了使这段代码更漂亮,你可以创建一个帮助类:class DynamicUrl(private val formatString: String, private vararg val args: Any?) {
fun toUri(): Uri = Uri.parse(formatString.format(*args))
}
现在你的fullPath
参数可以这样初始化:val fullPath = DynamicUrl("https://myBaseUrl/v2/products/%s/search", "storeCode").toUri()
关于android - 使用不同的路径参数更新 @url 路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69794278/