【问题标题】:Retrofit request url prevent urlencode android改造请求 url 防止 urlencode android
【发布时间】:2023-02-20 15:56:17
【问题描述】:

我有改造要求

@GET("{link}")
suspend fun getFilePart(@Path(value = "link") link: String): Deferred<NetworkResponse<ResponseBody, NetworkError>>

当我调用它时,我传递了一个“链接”

val base = if (BuildConfig.DEBUG) BuildConfig.TRANSFER_URL_DEBUG else BuildConfig.TRANSFER_URL
apiManager.appApiService(base).getFilePart(it.link)

假设链接类似于“https://storage_dev.example.com/10002/6d197e1e57e37070760c4ae28bf1...”,但在 Logcat 中我看到一些字符被 urlEncoded。 例如

以下网址 https://storage_dev.example.com/10002/6d197e1e57e37070760c4ae28bf18d813abd35a372b6a1f462e4cef21e505860.1&Somethingelse

转向
https://storage_dev.example.com/10002/6d197e1e57e37070760c4ae28bf18d813abd35a372b6a1f462e4cef21e505860.1%3FSomethingelse

如我所见,链接是一个字符串,其中有许多字符被编码为“&”已变成“%3F”

我怎样才能防止这种情况?

【问题讨论】:

    标签: android kotlin retrofit2 urlencode


    【解决方案1】:

    您可以将 encoded = true 添加到您的请求参数中,以告诉改造不要再次对其进行编码:

    /**
     * Specifies whether the parameter {@linkplain #value() name} and value are already URL encoded.
     */
    boolean encoded() default false;
    

    例子:

    @Path(value = "link", encoded = true)
    

    【讨论】:

    • 我试过了,但似乎没有用。我已经编辑了帖子
    【解决方案2】:

    如果您的链接包含 baseurl 部分,您应该使用 @Url 来避免该问题

    @GET
    suspend fun getFilePart(@Url link: String): Deferred<NetworkResponse<ResponseBody, NetworkError>>
    

    【讨论】:

    • 不...baseUrl 是构造函数的参数。但是我不知道!
    【解决方案3】:

    我想我迟到了但是这就是我解决它的方式..

    我的问题是 containes " 的 url,所以根据请求 url 它被编码然后看起来像这样 domain.com/api/%22SOME_URL_%22 只需添加拦截器即可捕获请求并对其进行解码。

     if(it.request().url().toString().contains("api/MY_SUB_DOMAIN")){
      
    val newUrl = java.net.URLDecoder.decode( it.request().url().toString(),
     StandardCharsets.UTF_8.name())      //  <--- This is your main solution (decode)
    
    .replace(""", "")                   // <---- I had to do this to remove parenthasis "
    
    
     requestBuilder.url(newUrl)          // <--- DONT FORGET TO ASSAIGN THE NEW URL
                
    
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      • 2017-01-09
      • 1970-01-01
      相关资源
      最近更新 更多