Mein apiPath ist voll dynamisch. Ich habe Artikel mit Feldern wie "ipAddress" und "SSLprotocol". Basierend auf sie, dass ich meine url bauen kann:So richten Sie Retrofit ohne baseUrl ein
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;
}
So kann mein Protokoll + Adresse sein: http: // + 192.168.0.01:8010 = http://192.168.0.01:8010
Und ich mag es so verwenden:
@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);
So vollständiger Pfad für authenticateUser würde http://192.168.0.01:8010/json/token.php sein - zum Beispiel.
Das bedeutet, dass ich keinen basePath brauche, weil ich selbst einen ganzen basePath erzeuge, abhängig von dem Server, mit dem ich mich verbinden möchte.
Mein Retrofit-Setup ist:
@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();
}
Wenn ich entfernen baseUrl dann ich Fehler erhalten, dass dieser Parameter erforderlich ist. Also habe ich meine apiBasePath an:
public String getApiBasePath() {
return "";
}
Und dann bekomme ich Fehler sofort, nachdem ich Retrofit-Instanz erstellen:
java.lang.IllegalArgumentException: Illegal URL:
Wie es zu lösen?
Können Sie "http: //" als Basis-URL verwenden? – TheoKanning
Hmm Nein, ich bekomme: java.lang.IllegalArgumentException: Illegale URL: http: // – F1sher
Sie könnten die Annotation @Url verwenden. Aber du musst jede url komplett kompilieren – Blackbelt