我想用HttpUrl对象来测试初始化Retrofit的baseurl:
HttpUrl baseUrl = new HttpUrl.Builder()
.scheme("https")
.host("api-staging.xxxx.co")
.build();
mRetrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(httpClient.build())
.build();
但是我为每个网址使用版本信息,例如: “https://api-staging.xxxx.co/v1/login”
所以我想在这个配置中指定版本。所以我尝试这样:
而且我不想在每个 WS(映射)上添加版本,那么我该如何正确地做到这一点呢?
非常感谢!
你不应该使用
.host(“api-staging.xxxx.co/v1/”)
主机可以是域名或IP地址。
可以使用“addPathSegment”方法添加段,或者这样写:
new Retrofit.Builder().baseUrl("api-staging.xxxx.co/v1/")
但是我为每个网址使用版本信息,例如: “https://api-staging.xxxx.co/v1/login”
如果你想使用动态url,你可以构建另一个retrofit实例,这是一个好方法。我曾经使用拦截器,但是当连续调用大量具有不同 url 的 api 时,这不是一个好方法(它调用错误的 url) 你可以用这样的方式:
public static Retrofit getClient(String baseURL) {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(baseURL)
.addConverterFactory(GsonConverterFactory.create())
.build();
} else {
if (!retrofit.baseUrl().equals(baseURL)) {
retrofit = new Retrofit.Builder()
.baseUrl(baseURL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
}
return retrofit;
}
我不确定这是否是您想要的,但我通常在模块的 build.gradle 中声明基本 URL:
android {
...
defaultConfig {
...
buildConfigField("String", "BASE_URL", "\"https://api-staging.xxxx.co/v1/login\"")
}
}
然后我这样使用它:
BuildConfig.BASE_URL
对于其他需要在baseUrl之后和path之前添加段的人: 你可以使用这个拦截器:
/**
* Interceptor that adds a common prefix to the request URL path.
*
* @param prefix the prefix to add to the request URL path
*/
class PathPrefixInterceptor(private val prefix: String) : Interceptor {
override fun intercept(chain: Chain): Response {
val request = chain.request()
// Don't change url if prefix is empty
if (prefix.isBlank()) {
return chain.proceed(request)
}
val httpUrl = request.url
val newHttpUrl = httpUrl.newBuilder()
.encodedPath("/$prefix${httpUrl.encodedPath}")
.build()
val modifiedRequest = request.newBuilder()
.url(newHttpUrl)
.build()
return chain.proceed(modifiedRequest)
}
}
然后在您的改造中使用它:
OkHttpClient.Builder()
.addInterceptor(PathPrefixInterceptor(prefix = "SomePrefix"))
.build()