Модернизация 2 – Динамический URL-адрес

С помощью Retrofit 2 вы можете установить полный URL-адрес в аннотации метода службы, например:

public interface APIService { @GET("http://api.mysite.com/user/list") Call<Users> getUsers(); } 

Однако в моем приложении URL-адрес моих веб-сервисов неизвестен во время компиляции, приложение извлекает их в загруженном файле, поэтому мне интересно, как я могу использовать Retrofit 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(); 

Но здесь Retrofit не видит, что путь на самом деле является полным URL-адресом и пытается загрузить http://api.mysite.com/http%3A%2F%2Fapi.mysite.com%2Fuser%2Flist

Любой намек на то, как я могу использовать Retrofit с таким динамическим URL-адресом?

спасибо

Solutions Collecting From Web of "Модернизация 2 – Динамический URL-адрес"

Я думаю, вы используете его неправильно. Вот выдержка из журнала изменений :

Новое: аннотация @Url позволяет передавать полный URL-адрес для конечной точки.

Таким образом, ваш интерфейс должен быть таким:

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

Начиная с Retrofit 2.0.0-beta2, если у вас есть служба, отвечающая JSON с этого URL-адреса: http: // myhost / mypath

Не работает следующее:

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

Я хотел заменить только часть URL-адреса, и с этим решением мне не нужно передавать весь URL-адрес, просто динамическую часть:

 public interface APIService { @GET("users/{user_id}/playlists") Call<List<Playlist> getUserPlaylists(@Path(value = "user_id", encoded = true) String userId); } 

Вы можете использовать закодированный флаг в аннотации @Path :

 public interface APIService { @GET("{fullUrl}") Call<Users> getUsers(@Path(value = "fullUrl", encoded = true) String fullUrl); } 
  • Это предотвратит замену / %2F .
  • Это не спасет вас ? Но вместо этого они заменяются на %3F , поэтому вы не можете передавать динамические строки запросов.