android - 使用不同的路径参数更新 @url 路径

标签 android retrofit2

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.HttpUrlStringjava.net.URIandroid.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/

相关文章:

java - 用于压缩文件的 uidevice takescreenshot 选项不起作用

Android 客户端 TCP 套接字

java - 使用 Retrofit 和 Gson 以及返回动态顶级 JSON 的 api

java - 代码似乎阻止 xml 布局在 Android Studio 中显示

android - 无法在带有大文本 : "Font size too large to fit in cache" 的 Android TextView 中显示 Unicode 字符(表情符号)

android - 文件模式 '*.psd'(来自 'bundled' 插件)被 'Adobe Photoshop' 插件重新分配给文件类型 'Android'

android - 单击通知操作时如何取消改造 2 请求?

android - Kotlin 数据类 |添加我自己的变量而不是 JSON 键

android - Retrofit2 上带有 HTTPs 的 SSLProtocolException

android - 改造。 java.net.协议(protocol)异常 : expected * bytes but received *