Можно ли использовать несколько базовых URL-адресов при модернизации?

Я хочу использовать два URL-адреса сервера с помощью модернизации, но только один работает, когда я использую два базовых URL-адреса. Подскажите, пожалуйста, как использовать два базовых URL в android.

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);


}

Да, вы можете создать два разных экземпляра Service. Где вы пытались использовать Url12? Кроме того, url1 не определяется в этом посте.

OneCricketeer 23.04.2018 09:51

официальная документация: futurestud.io/tutorials/…

Siarhei 29.08.2018 08:47
8
2
15 310
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

если вы работаете с двумя URL-адресами, вы создаете два объекта модернизации. потому что один объект модернизации работает с одним URL-адресом. если вы хотите получить доступ к двум, сделайте два объекта модификации, как показано ниже.

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();

если возможно без создания двух клиентов?

Bipin Bharti 14.12.2019 06:50

Думаю, вам нужен изменение URL-адреса во время выполнения на совершенно другой.

Например, следующий код будет override URL-адрес, переданный как baseUrl объекту модернизация.

@GET
public Call<ResponseBody> profilePicture(@Url String url);

Примечание: вы не можете добавить параметр url в @GET и @POST. URL-адрес должен быть передан на @Url.

// ERROR ( @Url cannot be used with @GET URL)
@GET("users") // or POST
public Call<Foo> getUsers(@Url String url);

// CORRECT
@GET
public Call<Foo> getUsers(@Url String fullUrl);

Обратитесь к этот учебник для получения дополнительной информации.

Как мы можем использовать с запросом POST? Как я получаю ошибку ниже при использовании этого. java.lang.IllegalArgumentException: URL-адрес нельзя использовать с URL-адресом POST (параметр №1) для метода

Muhammad Maqsood 24.08.2020 16:55

@MuhammadMaqsood Убедитесь, что вы не добавляете параметр в POST. (POST('/users/') неприемлем. Просто добавьте POST и передайте полный URL-адрес аннотации url). Я был чист?

Mahdi-Malv 24.08.2020 22:43

Я решил свой случай с HTTP-перехватчиками. Я хотел использовать несколько базовых URL-адресов и запрос POST с полезной нагрузкой.

Muhammad Maqsood 25.08.2020 11:00

Если ответ нуждается в редактировании или улучшении, вы можете это сделать.

Mahdi-Malv 25.08.2020 15:14

с 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)
    }
}

просто передайте baseUrl в методе вызова

Другие вопросы по теме