我现在有这个api用法:
App.API.foo(mapOf("a" to a, "b" to b)).enqueue(responseHandler)
// my api class
@POST("/foo-v1")
fun foo(@Body map: Map<String, String>): Call<Response>
现在我有了新的 api 路径:
"/foo-v2"
和在运行时定义的新 baseurl。
在运行时进行更改的最佳方法是什么? 我认为的选项:将
@Path("version") version: String
添加到 foo 函数将像这样:
@POST("/foo-{version}")
fun foo(@Body map: Map<String, String>, @Path("version") version: String): Call<Response>
对于一个请求来说还可以,但如果更改了很多请求,那就不太好了。
另一个问题,当某些请求还需要添加新路径时可以做什么,例如
@POST("/auth/foo-{version}")
我最初发表评论是因为时间紧迫,但我想提供一些快速代码来说明这一点。
提供这样的服务:
interface ChangeUrlService {
@POST(".")
fun foo(
@Header("url") url: String,
@Body map: Map<String, String>
): Call<Response>
}
您可以使用拦截器在运行时设置端点 url,该拦截器应用于您的 OkHttpClient.Builder。
class ChangeUrlInterceptor: Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
// This request is has "." as the url. We want to change it!
val request = chain.request()
/**
* Get the url argument via the headers. I exit early here
* with the original request going through the network but you
* can throw an exception or whatever.
*/
val url = request.header("url")
?: return chain.proceed(request)
val body = request.body // dont forget to apply your request body
/*
* Here's where you create your new request at runtime!
* /
val newRequest = Request.Builder()
.url(url)
.headers(request.headers)
.apply {
if(body == null) this else post(body)
}
.build()
return chain.proceed(newRequest)
}
}