我在下面使用改造和界面
@GET("{link}")
fun search(@Path(value = "link", encoded = true) link: String?): Call<Any>
除字符“?”外,是否需要对所有链接使用编码。
示例:
链接-> / api / search?&query =تست
通过改造的编码链接-> api / search%3F&query =%D8%AA%D8%B3%D8%AA
我需要此链接-> api / search?&query =%D8%AA%D8%B3%D8%AA
我不需要将字符'?'转换为%3F 。 反正吗?
答案 0 :(得分:2)
@Url应该用于此目的,而不是@Path
@GET
Call<ResponseClass> list(@Url String url);
在完整URL和用于基本URL的路径下正常工作。
Retrofit retrofit = Retrofit.Builder()
.baseUrl("https://website.com/");
.build();
MyService service = retrofit.create(MyService.class);
service.exampleCall("https://another-website.com/example");
service.anotherExampleCall("/only/path/part");
答案 1 :(得分:1)
不要使用Path,您可以在方法中使用@Query
,它不会将?
转换为%3F
。
您可以将方法更改为
@GET("api/serach")
fun search(@Query("query") value: String?): Call<Any>
例如,您的值为“ aolphn”,此代码将被访问
http(s)://xxx/api/search?query=aolphn
?
将自动添加。
答案 2 :(得分:-1)
我找到了解决方案,必须使用Interceptor来处理请求。
class RemoveCharacterInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val path = request.url().toString()
val string = path.replace("%3F", "?") // replace
val newRequest = request.newBuilder()
.url(string)
.build()
return chain.proceed(newRequest)
}
}
并添加到httpClient
val httpClient = OkHttpClient.Builder()
httpClient.addInterceptor(RemoveCharacterInterceptor())