代码之家  ›  专栏  ›  技术社区  ›  ant2009

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

  •  0
  • ant2009  · 技术社区  · 4 年前
    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>
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   Karma    4 年前

    你所尝试的不会奏效,因为如果你指定 @Url ,它需要一个静态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>
    

    还有你的 fullPath 参数可以这样初始化:

    val fullPath = "https://myBaseUrl/v2/products/%s/search".format("storeCode")
    

    解决方案2

    更好的方法是 不 使用 String 作为 @网址 参数 ( @网址 可以是 okhttp3.HttpUrl , 一串 , java.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>
    

    还有你的 全程 参数可以这样初始化:

    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))
    }
    

    现在你的 全程 参数可以这样初始化:

    val fullPath = DynamicUrl("https://myBaseUrl/v2/products/%s/search", "storeCode").toUri()
    
        2
  •  1
  •   Martin Zeitler    4 年前

    使用 @GET 注释
    ... 然后用 @Path 注释:

    @GET("{baseUrl}products/{storeCode}/search")
    fun searchProductV2(
        @Path("baseUrl") baseUrl: String = "https://myBaseUrl/v2/",
        @Path("storeCode") storeCode: String = "default",
        ...
    ): Single<Products>
    

    在那里也可以传递一个常量值:

    @GET(Constants.API_BASE_URL_V2 + "products/{storeCode}/search")
    fun searchProductV2(
        @Path("storeCode") storeCode: String = "default",
        ...
    ): Single<Products>
    

    或者只是版本 v2 ,假设 BASE_URL 属于 https://myBaseUrl/ .无论这些因素如何结合,都需要 String ,一个常量或 @路径 ,除此之外不允许:

    @GET(Constants.API_VERSION_V2 + "/products/{storeCode}/search")
    fun searchProductV2(
        @Path("storeCode") storeCode: String = "default",
        ...
    ): Single<Products>
    

    一般来说,没有其他办法。这是因为任何参数都不能替代另一个参数。此代码不运行,但只是 interface 定义,从中生成相应的运行时类——这就是为什么尝试添加自定义代码是毫无意义的。

    不确定是什么 Single<Products> 是,但默认(未映射/原始)返回类型为 Call<ResponseBody> 在爪哇。用于ORM(带GSON或Moshi转换器)的模型类可以使用 @SerializedName() 来映射字段名。

        3
  •  1
  •   Bhargav Rao rlgjr    4 年前

    似乎是显而易见的简单解决方案。。。

    @Url fullPath: String = "https://myBaseUrl/v2/products/" +storeCode+ "/search",