Я хочу использовать два 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);
}
официальная документация: futurestud.io/tutorials/…
если вы работаете с двумя 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();
если возможно без создания двух клиентов?
Думаю, вам нужен изменение 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) для метода
@MuhammadMaqsood Убедитесь, что вы не добавляете параметр в POST. (POST('/users/') неприемлем. Просто добавьте POST и передайте полный URL-адрес аннотации url). Я был чист?
Я решил свой случай с HTTP-перехватчиками. Я хотел использовать несколько базовых URL-адресов и запрос POST с полезной нагрузкой.
Если ответ нуждается в редактировании или улучшении, вы можете это сделать.
с 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 в методе вызова
Да, вы можете создать два разных экземпляра
Service. Где вы пытались использоватьUrl12? Кроме того,url1не определяется в этом посте.