改造:如何用段指定baseurl?

问题描述 投票:0回答:4

我想用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

所以我想在这个配置中指定版本。所以我尝试这样:

  • .host(“api-staging.xxxx.co/v1/”) > 崩溃

而且我不想在每个 WS(映射)上添加版本,那么我该如何正确地做到这一点呢?

非常感谢!

android retrofit2 okhttp
4个回答
0
投票

你不应该使用

.host(“api-staging.xxxx.co/v1/”)

主机可以是域名或IP地址。

可以使用“addPathSegment”方法添加段,或者这样写:

new Retrofit.Builder().baseUrl("api-staging.xxxx.co/v1/")


0
投票

但是我为每个网址使用版本信息,例如: “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;
    }

0
投票

我不确定这是否是您想要的,但我通常在模块的 build.gradle 中声明基本 URL:

android {
...
    defaultConfig {
    ...
        buildConfigField("String", "BASE_URL", "\"https://api-staging.xxxx.co/v1/login\"")
    }
}

然后我这样使用它:

BuildConfig.BASE_URL

0
投票

对于其他需要在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()
© www.soinside.com 2019 - 2024. All rights reserved.