2016-01-17 19 views
5

Il mio apiPath è completamente dinamico. Sto avendo oggetti contenenti campi come "ipAddress" e "SSLprotocol". Sulla base di loro posso costruire il mio url:Come installare Retrofit senza baseUrl

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

Quindi il mio protocollo + indirizzo può essere: http: // + 192.168.0.01:8010 = http://192.168.0.01:8010

e vorrei usarlo come quella:

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

percorso in modo completo per authenticateUser sarebbe http://192.168.0.01:8010/json/token.php - per esempio.

Ciò significa che non ho bisogno di alcun basePath perché creo me stesso basePath in base al server a cui desidero connettermi.

La mia configurazione è retrofit:

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

Se rimuovo baseurl tanto sono errore che questo parametro è obbligatorio. Così ho impostato il mio apiBasePath a:

public String getApiBasePath() { 
    return ""; 
} 

E poi ottengo l'errore immediatamente dopo creo esempio retrofit:

java.lang.IllegalArgumentException: Illegal URL: 

Come risolverlo?

+0

Ti consente di utilizzare "http: //" come URL di base? – TheoKanning

+0

Hmm no, ricevo: java.lang.IllegalArgumentException: URL non valido: http: // – F1sher

+0

potresti utilizzare l'annotazione @Url. Ma dovrai compilare ogni URL completamente – Blackbelt

risposta

16

Da source (Nuovo concetto di risoluzione URL) è possibile semplicemente specificare l'intero percorso in post richiesta.

Inoltre siamo anche in grado di dichiarare un URL completo in @Post in Retrofit 2.0:

public interface APIService { 

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

} 

URL di base verrà ignorata per questo caso.

0

Se si sta creando una nuova istanza RestAdapter ogni volta che si desidera effettuare una chiamata API, è possibile creare un nuovo adattatore con l'URL base come parametro.

Using absolute URLs with Retrofit

0

Sì, è possibile fare. Ho fatto così:

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

Fondamentalmente è necessario creare l'oggetto del retrofit una volta noto l'URL dell'endpoint. Immagino che non occorrano ulteriori spiegazioni in quanto il codice è auto esplicativo.

Supponendo che venga modificato solo l'URL di base.