J'ai un scénario où je dois appeler une API avec le même BaseUrl, par exemple. www.myAPI.com
mais avec une baseUrl
différente.
J'ai une instance de Retrofit 2
qui est construite via une Builder
:
return new Retrofit.Builder().baseUrl(FlavourConstants.BASE_URL).addConverterFactory(GsonConverterFactory.create(gson)).client(okHttpClient).build();
Le FlavourConstants.BASE_URL
ressemble à ceci:
public static final String BASE_URL = "http://myApi.development:5000/api/v1/";
Pour certains WebRequests
, je dois appeler la même API, mais sur d'autres, je dois l'appeler à partir d'une BaseUrl
complètement différente. Comment modifier l'instance Retrofit
pour qu'elle pointe par conséquent vers une URL différente lors de l'exécution?
L'instance Retrofit
n'a pas de .setBaseUrl
ou setter
ou quoi que ce soit de semblable car elle est construite via Builder
.
Des idées?
Heureusement pour vous, Retrofit a une solution simple pour cela:
public interface UserManager {
@GET
public Call<ResponseBody> userName(@Url String url);
}
La chaîne url
doit spécifier l’URL complète que vous souhaitez utiliser.
Je viens d'utiliser la fonction ci-dessous lorsque j'ai fait face à ce problème. mais j'étais pressé et je crois que je dois en utiliser un autre et j'utilisais "retrofit2: retrofit: 2.0.2"
public static Retrofit getClient(String baseURL) {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(baseURL)
.addConverterFactory(GsonConverterFactory.create())
.build();
} else {
if (!retrofit.baseUrl().equals(baseURL)) {
retrofit = new Retrofit.Builder()
.baseUrl(baseURL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
}
return retrofit;
}
[Update] J'ai trouvé ce link qui explique le @Url pouvant être envoyé en tant que paramètre et je crois que c'est plus professionnel que mon ancienne solution . Veuillez trouver ci-dessous le scénario:
interface APIService{
@POST
Call<AuthenticationResponse> login(@Url String loginUrl,[other parameters])
}
Et ci-dessous, la méthode de la classe qui fournit l'objet de modification
public static Retrofit getClient() {
if (retrofit==null) {
retrofit = new Retrofit.Builder()
.baseUrl("http://baseurl.com") // example url
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
Ensuite, vous pouvez appeler la méthode comme ci-dessous:
APIInterface apiInterface = ApiClient.getClient2().create(ApiInterface.class);
apiInterface.login("http://tempURL.com").enqueue(......);
Le moyen le plus simple (mais pas le plus performant) de modifier l'URL de base de Retrofit2 au moment de l'exécution est de reconstruire l'instance de modification avec la nouvelle adresse URL:
private Retrofit retrofitInstance = Retrofit.Builder().baseUrl(FlavourConstants.BASE_URL).addConverterFactory(GsonConverterFactory.create(gson)).client(okHttpClient).build();
public void setNewBaseUrl(String url) {
retrofitInstance = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(okHttpClient).build();
}
...
retrofitInstance.create(ApiService.class);
Si vous utilisez OkHttp avec Retrofit, vous pouvez également ajouter un intercepteur OkHttp tel que celui-ci lors de la construction de votre client OkHttp:
HostSelectionInterceptor hostInterceptor = new HostSelectionInterceptor();
hostInterceptor.setHost(newBaseUrl);
return new OkHttpClient.Builder()
.addInterceptor(hostInterceptor)
.build();
Ok, si je ne me souviens pas mal, la documentation de Retrofit indique que vous pouvez indiquer une autre URL si vous ajoutez simplement dans votre interface le service complet de l'URL du ws, qui est différent de BASE_URL dans Retrofit Builder. Un exemple...
public interface UserManager {
@GET("put here ur entire url of the service")
public Call<ResponseBody> getSomeStuff();
}
Une solution consiste à avoir deux instances distinctes de mise à niveau, une pour votre URL de base FLAVORED et une autre pour l’URL de base.
Il suffit donc de définir deux fonctions:
public Retrofit getFlavouredInstance() {
return new Retrofit.Builder().baseUrl(FlavourConstants.BASE_URL).addConverterFactory(GsonConverterFactory.create(gson)).client(okHttpClient).build();
}
public Retrofit getOtherBaseUrl() {
return Retrofit.Builder().baseUrl(OTHER_BASE_URL).addConverterFactory(GsonConverterFactory.create(gson)).client(okHttpClient).build();
}
et après vous devez juste utiliser le bon.