改造请求 url 防止 urlencode android

问题描述 投票:0回答:3

我有改装要求

@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
3个回答
0
投票

您可以将

encoded = true
添加到您的请求参数中以告诉改造不要再次编码它:

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

例子:

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

0
投票

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

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

0
投票

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

我的问题是 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
            

}

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.