我想使用两个服务器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);
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
SOService_AI类
public interface SOService_AI {
//URL 1
@FormUrlEncoded
@POST("/finalresult1")
Call<List<AIImageProcessing>> AiImageCheck(@Field("img_data") String imgdata, @Field("name")String imgName);
}
Run Code Online (Sandbox Code Playgroud)
如果您使用两个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;
}
Run Code Online (Sandbox Code Playgroud)
}
然后访问后,如下面的代码..
ApiClient.getInstance().getClient();
ApiClient.getInstance().getClient2();
Run Code Online (Sandbox Code Playgroud)
我猜您需要在运行时将URL更改为完全不同的URL。
例如,下面的例子将overrideURL作为传递baseUrl给改造对象。
@GET
public Call<ResponseBody> profilePicture(@Url String url);
Run Code Online (Sandbox Code Playgroud)
查看本教程以获取更多信息。
小智 5
使用 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)
}
}
Run Code Online (Sandbox Code Playgroud)
只需在 invoke 方法中传递 baseUrl
小智 5
现在这真的很容易,只需使用没有常量 url 的 Post 或 Get,而是在参数中接受它并使用 @Url 注释该参数
@GET
suspend fun handshakeUser(@Url url : String): Response<JsonObject>
@POST
suspend fun makePostRequest(
@Header("Authorization") token: String = getToken(),
@Url url: String,
@Body inputModel: JsonObject
): Response<JsonObject>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6289 次 |
| 最近记录: |