Дооснащение: как я могу указать 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()
Другие вопросы по тегам