2016-08-06 20 views
7

私は同じBaseUrlでAPIを呼び出す必要があるシナリオがあります。 www.myAPI.comであるが、異なっている。baseUrlRetrofit - BaseUrlを変更

私はBuilderを経由して構築されてRetrofit 2のインスタンスを持っている:

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

FlavourConstants.BASE_URLは次のようになります。いくつかのWebRequestsについては

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

、私は同じことを呼び出す必要がありますAPIを使用していますが、別のものでは全く別のBaseUrlから呼び出す必要があります。したがって、実行時にRetrofitインスタンスを別のURLを指すように変更するにはどうすればよいですか?

Retrofitインスタンスには.setBaseUrlまたはsetterなど、Builderで構築されたものと似ていないものがあります。

アイデア? url文字列を使用したいの完全なURLを指定する必要があり

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

:あなたはレトロフィット用

+0

あなたがすでに述べたように、 'Retrofit'インスタンスは一種の変更不可能なものです(ビルダーが何を意味するものなのか)。したがって、設定したい別のURLの別のインスタンスを作成する必要があります。 – asgs

答えて

8

ラッキーは、そのためのシンプルなソリューションを持っています。

+1

これは 'GET'メソッドに対してのみ機能し、' @ POST'のような 'HTTP'メソッドに対しては機能しません。私は問題を解決し、それが動作することを確認したら回答を投稿します。 – Subby

0

解決策は、FLAVOREDベースURLともう1つのベースURLの2つの異なるインスタンスを追加することです。

だから、ちょうど2つの関数を定義:

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

を、あなたはちょうど右のいずれかを使用する必要があります後。

1

実行時にRetrofit2ベースURLを変更する最も簡単な(ただし、最もパフォーマンス)の方法は、新しい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); 

、あなたがレトロフィットでOkHttp使用している場合は、あなたのOkHttpクライアントを構築するとき、あなたはthis oneのようなOkHttpインターセプタを追加することができます。

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

[OK]を、私はレトロフィットのドキュメントを間違って覚えていけない場合、あなたは単にフルservicseあなたのインターフェースに追加する場合は、別のURLを指すことができると言いますURL Retrofit BuilderではBASE_URLとは異なります。一例...

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