Дооснащение: как я могу указать baseurl с сегментом?
Я хочу протестировать объект HttpUrl для инициализации базового пакета Retrofit:
HttpUrl baseUrl = new HttpUrl.Builder()
.scheme("https")
.host("api-staging.xxxx.co")
.build();
mRetrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(httpClient.build())
.build();
Но я использую информацию о версии для каждого URL, например, например: " https://api-staging.xxxx.co/v1/login"
Поэтому я хочу указать версию в этой конфигурации. Итак, я попытался так:
- .host ("api-staging.xxxx.co/v1/")> CRASH
И я не хочу добавлять версию для каждого WS (отображения), так как я могу сделать это правильно, ребята?
Большое спасибо!
4 ответа
Я не уверен, что это то, что вам нужно, но я обычно указываю базовый URL в build.gradle моего модуля:
android {
...
defaultConfig {
...
buildConfigField("String", "BASE_URL", "\"https://api-staging.xxxx.co/v1/login\"")
}
}
И тогда я использую это так:
BuildConfig.BASE_URL
Ты не должен использовать
.host("api-staging.xxxx.co/v1/")
хост просто может быть доменным именем или IP-адресом.
Вы можете использовать метод addPathSegment, чтобы добавить сегмент, или написать так:
new Retrofit.Builder().baseUrl("api-staging.xxxx.co/v1/")
Но я использую информацию о версии для каждого URL, например, например: " https://api-staging.xxxx.co/v1/login"
Если вы хотите использовать динамический URL, вы можете создать еще один экземпляр модификации, это хороший способ. Раньше я использовал перехватчик, но это не очень хороший способ, когда вы вызываете много API с разными URL-адресами (это вызывает неправильные 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;
}
для других, кому нужно добавить сегмент после baseUrl и перед путем: вы можете использовать этот перехватчик:
/**
* Interceptor that adds a prefix and/or suffix to the request URL path.
*
* @param prefix the prefix to add to the request URL path
* @param suffix the suffix to add to the request URL path
*/
class UrlPathInterceptor(
private val prefix: String? = null,
private val suffix: String? = null
) : Interceptor {
/**
* Interceptor that adds a prefix and/or suffix to the request URL path.
*
* @param chain the chain of interceptors
* @return the response from the next interceptor in the chain
*/
override fun intercept(chain: Chain): Response {
val request = chain.request()
if (prefix.isNullOrBlank() && suffix.isNullOrBlank()) {
return chain.proceed(request)
}
val httpUrl = request.url
val newPath = buildNewPath(httpUrl.encodedPath)
val newHttpUrl = httpUrl.newBuilder()
.encodedPath(newPath)
.build()
val modifiedRequest = request.newBuilder()
.url(newHttpUrl)
.build()
return chain.proceed(modifiedRequest)
}
/**
* Builds the new path by cleaning the prefix, suffix, and path, and then joining them with a forward slash.
*
* @param path the path to clean and join
* @return the new path
*/
private fun buildNewPath(path: String): String {
val cleanedPrefix = cleanPath(prefix)
val cleanedSuffix = cleanPath(suffix)
val cleanedPath = cleanPath(path)
val parts = listOf(cleanedPrefix, cleanedPath, cleanedSuffix).filter { it.isNotBlank() }
return parts.joinToString(separator = "/", prefix = "/", postfix = "/")
}
/**
* Cleans the path by removing any leading or trailing forward slashes.
*
* @param path the path to clean
* @return the cleaned path
*/
private fun cleanPath(path: String?): String {
return path?.removePrefix("/")?.removeSuffix("/")?: ""
}
}
Затем используйте его в своей модернизации:
OkHttpClient.Builder()
.addInterceptor(UrlPathInterceptor(prefix = "SomePrefix"))
.build()