2016-01-17 10 views
5

Moja apiPath jest w pełni dynamiczna. Mam elementy zawierające pola takie jak "ipAddress" i "SSLprotocol". Na ich podstawie można zbudować mój URL:Jak skonfigurować Retrofit bez podstawy?

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

Więc mój protokół + adres może być: http: // + 192.168.0.01:8010 = http://192.168.0.01:8010

I chciałbym używać go tak:

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

Więc pełna ścieżka do authenticateUser byłoby http://192.168.0.01:8010/json/token.php - na przykład.

Oznacza to, że nie potrzebuję żadnej bazy, ponieważ sam tworzę całą bazę BasePath w zależności od serwera, z którym chcę się połączyć.

Moja konfiguracja modernizacyjny jest:

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

Jeśli usunąć baseURL następnie otrzymuję błąd, który wymagany jest ten parametr. Więc mogę ustawić apiBasePath do:

public String getApiBasePath() { 
    return ""; 
} 

A potem dostaję błąd natychmiast po utworzeniu modernizacji instancję:

java.lang.IllegalArgumentException: Illegal URL: 

jak go rozwiązać?

+0

Czy pozwala używać "http: //" jako adresu bazowego? – TheoKanning

+0

Hmm nie, dostaję: java.lang.IllegalArgumentException: Nielegalny URL: http: // – F1sher

+0

można użyć adnotacji @Url. Ale będziesz musiał zbudować każdy URL całkowicie – Blackbelt

Odpowiedz

16

Od source (Nowa koncepcja rozwiązywania adresów URL) można po prostu określić całą ścieżkę w żądaniu pocztowym.

Ponadto możemy również zadeklarować pełny adres URL w @post w Retrofit 2.0:

public interface APIService { 

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

} 

bazowy URL będą ignorowane dla tej sprawy.

0

Jeśli masz problemy z tworzeniem nowej instancji RestAdapter za każdym razem, gdy chcesz wykonać wywołanie api, możesz utworzyć nowy adapter z podstawowym adresem URL jako parametrem.

Using absolute URLs with Retrofit

0

Tak można zrobić. Zrobiłem tak:

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

Zasadniczo musisz utworzyć obiekt modernizacji, gdy znasz adres URL punktu końcowego. Chyba nie potrzeba więcej wyjaśnień, ponieważ kod jest oczywisty.

Zakładając, że zmienia się tylko adres podstawowy.