Retrofit 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 ?

спасибо

4 97

4 ответа:

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

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

поэтому ваш интерфейс должен быть таким:

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

Я хотел заменить только часть 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, однако, так что вы все еще не можете передать в динамических строках запроса.

начиная с модификации 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();