Как настроить дооснащение без baseUrl
Мой apiPath полностью динамичен. У меня есть элементы, содержащие такие поля, как "ipAddress" и "SSLprotocol". Основываясь на них, я могу построить свой url:
private String urlBuilder(Server server) {
String protocol;
String address = "";
if (AppTools.isDeviceOnWifi(activity)) {
address = serverToConnect.getExternalIp();
} else if (AppTools.isDeviceOnGSM(activity)) {
address = serverToConnect.getInternalIp();
}
if (server.isShouldUseSSL()) {
protocol = "https://";
} else {
protocol = "http://";
}
return protocol + address;
}
Таким образом, мой протокол + адрес может быть: http://+ 192.168.0.01:8010 = http://192.168.0.01:8010
И я хотел бы использовать его так:
@FormUrlEncoded
@POST("{fullyGeneratedPath}/json/token.php")
Observable<AuthenticationResponse> authenticateUser(
@Path("fullyGeneratedPath") String fullyGeneratedPath,
@Field("login") String login,
@Field("psw") String password,
@Field("mobile") String mobile);
Таким образом, полный путь для authenticateUser будет выглядеть следующим образом: http://192.168.0.01:8010/json/token.php.
Это означает, что мне не нужен basePath, потому что я создаю весь basePath сам в зависимости от сервера, к которому я хочу подключиться.
Моя настройка:
@Provides
@Singleton
Retrofit provideRetrofit(OkHttpClient okHttpClient,
Converter.Factory converterFactory,
AppConfig appConfig) {
Retrofit.Builder builder = new Retrofit.Builder();
builder.client(okHttpClient)
.baseUrl(appConfig.getApiBasePath())
.addConverterFactory(converterFactory)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create());
return builder.build();
}
Если я удалю baseUrl, тогда я получу ошибку, чтобы этот параметр был необходим. Поэтому я установил apiBasePath для:
public String getApiBasePath() {
return "";
}
И тут я получаю ошибку сразу после создания экземпляра модификации:
java.lang.IllegalArgumentException: Illegal URL:
Как его решить?
Ответы
Ответ 1
Из источника (новая концепция разрешения URL) вы можете просто указать весь путь в почтовом запросе.
Кроме того, мы также можем объявить полный URL-адрес в @Post в Retrofit 2.0:
public interface APIService {
@POST("http://api.nuuneoi.com/special/user/list")
Call<Users> loadSpecialUsers();
}
Базовый URL-адрес будет проигнорирован для этого случая.
Ответ 2
Если вы RestAdapter
с созданием нового экземпляра RestAdapter
каждый раз, когда хотите сделать api-вызов, вы можете создать новый адаптер с базовым url в качестве параметра.
Использование абсолютных URL-адресов с помощью дооснащения
Ответ 3
Да, вы можете это сделать. Я сделал вот так:
public APIHelper(BaseActivity activity) {
String url = Common.getAPIUrl();
RestAdapter restAdapter = new RestAdapter.Builder()
.setLogLevel(RestAdapter.LogLevel.FULL)
.setEndpoint(url)
.build();
methods = restAdapter.create(IAppService.class);
}
В принципе, вам нужно создать объект модернизации, как только вы узнаете URL-адрес конечной точки. Думаю, больше не нужно объяснять, поскольку код сам объясняет.
Предполагая, что изменяется только базовый url.
Ответ 4
Мой способ использовать модификацию
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.okhttp3:okhttp:3.10.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.10.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.1.8'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
И вот у меня есть общий класс, и внутри у меня есть мой метод
public static AppServiceApi setMyRetrofit(){
Retrofit retrofit = null;
AppServiceApi appServices = null;
if (retrofit == null){
Gson gson = new GsonBuilder()
.setLenient()
.create(); //
retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(getClient())
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
appServices = retrofit.create(AppServiceApi.class);
}
return appServices;
}
public static OkHttpClient getClient(){
HttpLoggingInterceptor interceptor=new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor)
/*.connectTimeout(15, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)*/.build();
return client;
}
где интерфейс AppServiceApi имеет все мои конечные URL-адреса и тип метода
Ответ 5
просто используйте как это
public interface UserService {
@GET
public Call<ResponseBody> profilePicture(@Url String url);
}
источник
Ответ 6
С Retrofit 2 вы все равно должны добавить базовый URL. Если он неизвестен, тогда вы можете просто указать любой URL, обычно это полезно использовать http://localhost/
.