2016-01-17 16 views
5

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?

+0

Können Sie "http: //" als Basis-URL verwenden? – TheoKanning

+0

Hmm Nein, ich bekomme: java.lang.IllegalArgumentException: Illegale URL: http: // – F1sher

+0

Sie könnten die Annotation @Url verwenden. Aber du musst jede url komplett kompilieren – Blackbelt

Antwort

16

Von source (Neue URL Resolving-Konzept) Sie können einfach ganze Pfad in Post-Anfrage angeben.

public interface APIService { 

    @POST("http://api.nuuneoi.com/special/user/list") 
    Call<Users> loadSpecialUsers(); 

} 

Basis-URL für diesen Fall ignoriert werden:

Darüber hinaus können wir auch eine vollständige URL in @Post in Retrofit 2.0 deklarieren.

0

Wenn Sie mit dem Erstellen einer neuen RestAdapter-Instanz jedes Mal, wenn Sie einen API-Aufruf durchführen möchten, einverstanden sind, können Sie einen neuen Adapter mit der Basis-URL als Parameter erstellen.

Using absolute URLs with Retrofit

0

Ja Sie tun können. Ich habe so getan:

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

Grundsätzlich müssen Sie Objekt der Nachrüstung erstellen, sobald Sie die Endpunkt-URL kennen. Ich denke, es ist keine Erklärung mehr nötig, da der Code selbsterklärend ist.

Angenommen, dass nur die Basis-URL geändert wird.

Verwandte Themen