是否可以在改造中使用多个baseurl?

时间:2018-04-23 07:46:59

标签: android retrofit2

我想使用改造使用两个服务器URL,但是当我使用两个基本URL时,只有一个正在工作。请告诉我如何在android中使用两个基本URL。

public class APIUtils {
    public static String Url1 = "http://10.0.13.46:19460";
    public static String Url12 = "http://freshcamera.herokuapp.com";


    public static SOService getSOService(String url) {
        return RetrofitClient.getClient(url1).create(SOService.class);
    }

}

SOService类

public interface SOService {


   //URL 2
    @FormUrlEncoded
    @POST("/api/user/LoginUser")
    Call<Login> Login(@Field("username") String username, @Field("password")String password, @Field("grant_type")String passwords);
}

SOService_AI类

public interface SOService_AI {


    //URL 1
    @FormUrlEncoded
    @POST("/finalresult1")
    Call<List<AIImageProcessing>> AiImageCheck(@Field("img_data") String imgdata, @Field("name")String imgName);


}

3 个答案:

答案 0 :(得分:3)

我想您需要的是在运行时将URL更改为一个完全不同的URL

例如,以下示例将select * from t where REGEXP_LIKE(c,'^\d*\.\d{10}$'); 作为override传递给 retrofit 对象的URL。

baseUrl

结帐this tutorial以获得更多信息。

答案 1 :(得分:2)

如果您正在使用两个网址,那么您将创建两个改造对象。因为单个改造对象适用于单个URL。 如果你想访问两个你的make两个retofit对象,如下面的代码..

public class ApiClient {
private final static String BASE_URL = "https://simplifiedcoding.net/demos/";
private final static String BASE_URL2 = "http://freshcamera.herokuapp.com";

public static ApiClient apiClient;
private Retrofit retrofit = null;
private Retrofit retrofit2=null;

public static ApiClient getInstance() {
    if (apiClient == null) {
        apiClient = new ApiClient();
    }
    return apiClient;
}

//private static Retrofit storeRetrofit = null;

public Retrofit getClient() {
    return getClient(null);
}

public Retrofit getClient2() {
    return getClient2(null);
}


private Retrofit getClient(final Context context) {

    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient.Builder client = new OkHttpClient.Builder();
    client.readTimeout(60, TimeUnit.SECONDS);
    client.writeTimeout(60, TimeUnit.SECONDS);
    client.connectTimeout(60, TimeUnit.SECONDS);
    client.addInterceptor(interceptor);
    client.addInterceptor(new Interceptor() {
        @Override
        public okhttp3.Response intercept(Chain chain) throws IOException {
            Request request = chain.request();

            return chain.proceed(request);
        }
    });

    retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(client.build())
            .addConverterFactory(GsonConverterFactory.create())
            .build();


    return retrofit;
}
private Retrofit getClient2(final Context context) {

    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient.Builder client = new OkHttpClient.Builder();
    client.readTimeout(60, TimeUnit.SECONDS);
    client.writeTimeout(60, TimeUnit.SECONDS);
    client.connectTimeout(60, TimeUnit.SECONDS);
    client.addInterceptor(interceptor);
    client.addInterceptor(new Interceptor() {
        @Override
        public okhttp3.Response intercept(Chain chain) throws IOException {
            Request request = chain.request();

            return chain.proceed(request);
        }
    });

    retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL2)
            .client(client.build())
            .addConverterFactory(GsonConverterFactory.create())
            .build();


    return retrofit;
}

}

然后访问如下代码..

        ApiClient.getInstance().getClient();
    ApiClient.getInstance().getClient2();

答案 2 :(得分:0)

使用Kotlin更容易

companion object {
    // init Retrofit base server instance
    val redditClient by lazy { ApiService.invoke(REDDIT_BASE_URL) }
    val stackClient by lazy { ApiService.invoke(STACK_BASE_URL) }

    private val loggingInterceptor = HttpLoggingInterceptor().apply {
        this.level = HttpLoggingInterceptor.Level.BODY
    }

    operator fun invoke(baseUrl: String): ApiService {
        val client = OkHttpClient.Builder().apply {
            /**addNetworkInterceptor(StethoInterceptor()) */
            addNetworkInterceptor(loggingInterceptor)
            connectTimeout(10, TimeUnit.MINUTES)
            readTimeout(10, TimeUnit.MINUTES)
            writeTimeout(10, TimeUnit.MINUTES)
        }.build()

        return Retrofit.Builder()
            .client(client)
            .baseUrl(baseUrl)
            .addCallAdapterFactory(CoroutineCallAdapterFactory())
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ApiService::class.java)
    }
}

只需在invoke方法中传递baseUrl