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 ответа:
Я думаю, что вы используете его неправильно. Вот отрывок из изменений:
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();