2016-08-06 33 views
7

Ich habe ein Szenario, wo ich eine API mit der gleichen BaseUrl, z. www.myAPI.com aber mit einer anderen baseUrl.Retrofit - Change BaseUrl

Ich habe eine Instanz von Retrofit 2, die über eine Builder gebaut:

return new Retrofit.Builder().baseUrl(FlavourConstants.BASE_URL).addConverterFactory(GsonConverterFactory.create(gson)).client(okHttpClient).build();

Die FlavourConstants.BASE_URL sieht wie folgt aus:

public static final String BASE_URL = "http://myApi.development:5000/api/v1/";

Für einige WebRequests, muss ich die gleiche nennen API aber auf anderen muss ich es von einem ganz anderen BaseUrl nennen. Wie ändere ich die Retrofit -Instanz, um während der Laufzeit auf eine andere URL zu zeigen?

Die Retrofit Instanz keine .setBaseUrl oder setter oder etwas ähnliches, wie es über ein Builder gebaut ist.

Irgendwelche Ideen?

+0

Wie Sie bereits erwähnt haben, ist die 'Retrofit'-Instanz eine Art unveränderlich (Art von was Builder für sind). Sie müssen also eine andere Instanz für die andere URL erstellen, die Sie festlegen möchten. – asgs

Antwort

8

Glück für Sie haben Retrofit eine einfache Lösung dafür:

public interface UserManager { 
    @GET 
    public Call<ResponseBody> userName(@Url String url); 
} 

Der url String sollte die vollständige URL angeben, die Sie verwenden möchten.

+1

Dies funktioniert nur für 'GET'-Methoden und nicht für' HTTP'-Methoden wie '@ POST'. Ich habe das Problem gelöst und werde eine Antwort veröffentlichen, sobald ich überprüft habe, dass es funktioniert. – Subby

0

Eine Lösung besteht darin, zwei verschiedene Nachrüstungen zu haben, eine für Ihre FLAVORED-Basis-URL und eine weitere für die andere Basis-URL.

So definieren nur zwei Funktionen:

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

und nachdem Sie genau das Richtige verwenden.

1

Die einfachste (aber nicht der performant) Weg, um die Retrofit2 Basis-URL zur Laufzeit zu ändern, ist die Retrofit-Instanz mit dem neuen URL neu zu erstellen:

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

Alternativ, wenn Sie mit Retrofit verwenden OkHttp, Sie können eine OkHttp Abfangjäger wie this one hinzufügen, wenn Ihr OkHttp Client Aufbau:

HostSelectionInterceptor hostInterceptor = new HostSelectionInterceptor(); 
hostInterceptor.setHost(newBaseUrl); 
return new OkHttpClient.Builder() 
    .addInterceptor(hostInterceptor) 
    .build(); 
1

Ok, wenn ich mich nicht erinnern falsch die Dokumentation von Retrofit sagt man auf eine andere URL verweisen können, wenn Sie einfach nur in Ihrer Schnittstelle servicse die volle hinzufügen url der ws, das unterscheidet sich von der BASE_URL im Retrofit Builder. Ein Beispiel ...

public interface UserManager { 
    @GET("put here ur entire url of the service") 
    public Call<ResponseBody> getSomeStuff(); 
}