web-dev-qa-db-fra.com

Retrofit - Change BaseUrl

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?

15
Subby

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.

13
Andro Secy

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(......);
3
Vattic

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

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();
}
1
Catluc

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.

0
Mathieu Bertin