我正在将我的Android应用转换为使用Retrofit2而不是Volley。最初我有一个单例Retrofit实例,我将用它来创建Retrofit服务对象。 但该应用程序需要与不同的URL基本URL的服务进行通信。我想弄清楚在Retrofit中切换基本网址的最佳方法是什么。我已经阅读了以下解决方案:
在我的应用程序中,90%的调用都是针对相同的基本网址。其他10%的人有4-5个不同的网址。 现在我觉得最好只使用OkHttp来使用这些异常值调用。
关于什么是这个的好解决方案的任何想法?
答案 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
}