使用不同的基本网址配置Retrofit

时间:2018-02-03 20:37:04

标签: android retrofit2 okhttp3

我正在将我的Android应用转换为使用Retrofit2而不是Volley。最初我有一个单例Retrofit实例,我将用它来创建Retrofit服务对象。 但该应用程序需要与不同的URL基本URL的服务进行通信。我想弄清楚在Retrofit中切换基本网址的最佳方法是什么。我已经阅读了以下解决方案:

  1. 我已阅读线程,建议在拦截器级别切换基本网址。这似乎是一个hacky解决方案,在网络层切换基本URL。
  2. 还可以选择使用多个Retrofit实例来处理不同的URL。我不太喜欢这个,因为它最终可能会创建大量的Retrofit实例。
  3. 在我的应用程序中,90%的调用都是针对相同的基本网址。其他10%的人有4-5个不同的网址。 现在我觉得最好只使用OkHttp来使用这些异常值调用。

    关于什么是这个的好解决方案的任何想法?

5 个答案:

答案 0 :(得分:1)

为什么不创建另一个API服务,它对我有效?

API1的类

public class UtilsApi1 {

    public static final String BASE_URL1 = "http://YourBaseURL1";

    public static BaseApiService getAPI1(){
        return RetrofitClient1.getClient(BASE_URL1).create(BaseApiService.class);
    }
}

API2的类

public class UtilsApi2 {

    public static final String BASE_URL2 = "http://YourBaseURL2";

    public static BaseApiService getAPI2(){
        return RetrofitClient2.getClient(BASE_URL2).create(BaseApiService.class);
    }
}
例如,

制作2个改造客户端

public class RetrofitClient1 {
private static Retrofit retrofit = null;
    public static Retrofit getClient(String baseUrl){
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();

    if (retrofit == null){
        retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();
    }
    return retrofit;
    }
}

和[接口]用于API服务

public interface BaseApiService {

@FormUrlEncoded
@POST("complete the URL")
Call<ResponseBody> get_methode (@Field("?") String ?);
}

您可以与此通话

 BaseApiService Api1; //above the onCreate

在onCreate内

Api1    = UtilsApi1.get_methode();

答案 1 :(得分:0)

public class RetrofitService {  
public static String apiBaseUrl = "http://myurl";
private static Retrofit retrofit;

private static Retrofit.Builder builder =
        new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(apiBaseUrl);

private static OkHttpClient.Builder httpClient =
        new OkHttpClient.Builder();



public static void changeApiBaseUrl(String newApiUrl) {
    apiBaseUrl = newApiUrl;

    builder = new Retrofit.Builder()
                    .addConverterFactory(GsonConverterFactory.create())
                    .baseUrl(apiBaseUrl);
}

public static <S> S createRetrofitService(Class<S> serviceClas) {

    retrofit = builder.build();
    return retrofit.create(serviceClass);;
  }

您的第一个API调用将是

MyFirstApi api1=RetrofitService.createRetrofitService(MyFirstApi.class);
//..............

您的第二个API调用将是。

RetrofitService.changeApiBaseUrl("your new url");
MySecondApi api2=RetrofitService.createRetrofitService(MySecondApi.class); 

答案 2 :(得分:0)

我已经用这种方式解决了它:

这是我的改造实例:

    val retrofit = Retrofit.Builder()
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .baseUrl("http://baseurl....")
            .client(client)
            .build()

当我下载数据时,我只是这样改变网址:

@GET
fun downloadData(@Url url: String): Observable<Response<ResponseBody>>

答案 3 :(得分:0)

如果你查看函数的文档。

public Builder baseUrl(HttpUrl baseUrl)

有人提到,如果您提供带有主机名和方案的完整网址,那么它将覆盖基本网址。

 <p>Values which have a host replace the host of {@code baseUrl} and values also with a scheme
 replace the scheme of {@code baseUrl}.
 <p>Base URL: http://example.com/<br>
 Endpoint: https://github.com/square/retrofit/<br>
 Result: https://github.com/square/retrofit/

所以如果你想配置多个base url。如官方文档中所述,在端点中使用完整的 url。

答案 4 :(得分:-1)

例如,您可以创建一些类,如ServiceGenerator,它将实际处理和管理您的URL和一般请求参数。然后创建一些类似ServerManager的实例,其中包含必要的url。所以你可以配置这样的请求:

public static <S> S createService(Class<S> serviceClass, ServerManager serverManager) {
    Retrofit retrofit = serverManager.getBuilder()
                                     .client(httpClient.build())
                                     .build();
    return retrofit.create(serviceClass);
}

在ServerManager中:

public void setServerUrl(Servers serverUrl) {
    mBuilder.baseUrl(serverUrl.getUrl()); //mBuilder - Instance of Retrofit.Builder
}