2015-09-14 12 views
72

、あなたは次のようにserviceメソッドの注釈に完全なURLを設定することができますアプリはダウンロードしたファイルでそれらを取得するので、完全な動的URLでRetrofit 2をどのように使用することができるのだろうと思っています。レトロフィット2レトロフィット2での動的URL

私のような完全なパスを設定してみました:

public interface APIService { 
    @GET("{fullUrl}") 
    Call<Users> getUsers(@Path("fullUrl") fullUrl); 
} 

new Retrofit.Builder() 
    .baseUrl("http://api.mysite.com/") 
    .build() 
    .create(APIService.class) 
    .getUsers("http://api.mysite.com/user/list"); // this url should be dynamic 
    .execute(); 

をしかし、ここで、レトロフィットは、パスが実際に完全なURLであるとhttp://api.mysite.com/http%3A%2F%2Fapi.mysite.com%2Fuser%2Flist

にどのように任意のヒントをダウンロードしようとしていることを見ていませんこのような動的URLを使ってRetrofitを使用することはできますか?

は、私はあなたが間違った方法でそれを使用していると思うあなた

+1

があり、 Retrofitで動的URLに関するガイド:https://futurestud.io/tutorials/retrofit-2-how-to-use-dynamic-urls-for-requests – peitek

答えて

178

ありがとうございます。 changelogからの抜粋:

新規:@Urlパラメータ注釈では、エンドポイントの完全なURLを渡すことができます。

だからあなたのインターフェイスは次のようにする必要があります: http://myhost/mypath

以下の通りです:あなたはこのURLからJSON応答サービスを持っている場合は、レトロフィット2.0.0-β2のよう

public interface APIService { 
    @GET 
    Call<Users> getUsers(@Url String url); 
} 
+0

ニース、私はこの注釈を知らなかった!ありがとうございました – pdegand59

+1

@ pdegand59これは新品です:) [changelog](https://github.com/square/retrofit/blob/master/CHANGELOG.md)を参照してください – Yazazzello

+0

エンドポイントのURLはフルールですか、なぜベースルルが必要ですか? – Billyjoker

14

動作していません:

public interface ClientService { 
    @GET("") 
    Call<List<Client>> getClientList(); 
} 

Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl("http://myhost/mypath") 
    .addConverterFactory(GsonConverterFactory.create()) 
    .build(); 

ClientService service = retrofit.create(ClientService.class); 

Response<List<Client>> response = service.getClientList().execute(); 

これは正常です:

public interface ClientService { 
    @GET 
    Call<List<Client>> getClientList(@Url String anEmptyString); 
} 

Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl("http://myhost/mypath") 
    .addConverterFactory(GsonConverterFactory.create()) 
    .build(); 

ClientService service = retrofit.create(ClientService.class); 

Response<List<Client>> response = service.getClientList("").execute(); 
13

あなたは@Path注釈にエンコードフラグを使用することができます。

public interface APIService { 
    @GET("{fullUrl}") 
    Call<Users> getUsers(@Path(value = "fullUrl", encoded = true) String fullUrl); 
} 
  • これは%2F/の交換を防ぐことができます。
  • ?%3Fに置き換えられることはありませんが、それでも動的クエリ文字列を渡すことはできません。
+0

で私を助けてくださいすることができますが、タイプミスを「エンコード」されます?私は 'エンコード'しか使用できませんでした。 – kev

31

だけ動的部分、私は、URLの一部だけを交換したかった、そしてこの溶液を、私は、全体のURLを渡す必要はありません。将来サーチャーのために

public interface APIService { 

    @GET("users/{user_id}/playlists") 
    Call<List<Playlist> getUserPlaylists(@Path(value = "user_id", encoded = true) String userId); 
} 
関連する問題